私はAndroidは初めてですが、ソケットは初めてです。UAVServerスレッドを実行するボタンのあるGUIがあります。クリックすると、サーバーはクライアントをリッスンする必要があります。コードの行...
Socket client = serverSocket.accept();
...クライアントが接続するまでブロックする必要があります。しかし、「残念ながら、DroidUAVは停止しました」とクラッシュします。
public class UAVServer extends Thread {
private String TAG = UAVServer.class.getSimpleName();
@Override
public void run() {
ServerSocket serverSocket;
try {
serverSocket = new ServerSocket(12345);
Log.d(TAG, "Fails at the next line of code");
Socket client = serverSocket.accept();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
これは非常に簡単に思えますが、なぜクラッシュするのでしょうか。また、Androidはブロッキングポートをどのように処理しますか。これはそれと関係がある可能性があります。Wi-Fiの場合、ポートのブロックを解除するのはルーター次第だと思います。しかし、私が4Gだけを使用していた場合はどうなりますか?
注:uses-permission android:name="android.permission.INTERNET"はマニフェストファイルにあります。
編集:代わりにクライアントを実行させようとしただけで、この行でクラッシュするため、何か間違ったことをしている必要があります...
Socket s = new Socket("192.168.1.102",4444);
編集:エラーを追加しました...
FATAL EXCEPTION: main
java.lang.IllegalStateException: Could not execute method of the activity
at android.view.View$1.onClick(View.java:3071)
at android.view.View.performClick(View.java:3538)
at android.widget.CompoundButton.performClick(CompoundButton.java:103)
at android.view.View$PerformClick.run(View.java:14319)
at android.os.Handler.handleCallback(Handler.java:608)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:156)
at android.app.ActivityThread.main(ActivityThread.java:5099)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:991)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:758)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at android.view.View$1.onClick(View.java:3066)
... 12 more
Caused by: android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1190)
at libcore.io.BlockGuardOs.accept(BlockGuardOs.java:54)
at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:98)
at java.net.ServerSocket.implAccept(ServerSocket.java:202)
at java.net.ServerSocket.accept(ServerSocket.java:127)
at com.example.droiduav.UAVServer.run(UAVServer.java:19)
at com.example.droiduav.MainActivity.onToggleServer(MainActivity.java:31)
... 15 more