我正在尝试检查是否可以使用这个简单的方法与我的 TCP 服务器建立连接:
public static boolean serverListening()
{
Socket s = null;
try
{
s = new Socket("192.168.42.213", 80);
return true;
}
catch (Exception e)
{
Log.d("SocketException", "Exception",e);
return false;
}
finally
{
if(s != null)
try {s.close();}
catch(Exception e){}
}
}
我的服务器已经正常工作,因为我可以使用模拟器内的 Chrome 连接到它,所以问题一定出在我的代码中。 如果我尝试运行代码,则会出现以下异常:
SocketException
android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1513)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:389)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:230)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:212)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:436)
at java.net.Socket.connect(Socket.java:621)
at java.net.Socket.connect(Socket.java:570)
at java.net.Socket.<init>(Socket.java:450)
at java.net.Socket.<init>(Socket.java:218)
at com.example.batterymonitor.MainActivity.serverListening(MainActivity.java:104)
at com.example.batterymonitor.MainActivity.onCreate(MainActivity.java:58)
at android.app.Activity.performCreate(Activity.java:7136)
at android.app.Activity.performCreate(Activity.java:7127)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
非常感谢您的帮助!
最佳答案
在 Android 中,您无法在主线程上运行与网络相关的操作 - 您需要在不同的线程上运行它们,例如:
Thread mThread = new Thread(new Runnable() {
@Override
public void run() {
try {
//Put your code that you want to run in here(check your connection for example)
} catch (Exception e) {
e.printStackTrace();
}
}
});
mThread.start
关于java - 尝试连接到 TCP 服务器时出现套接字异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54983404/