1

私は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
4

1 に答える 1

4

さて、あなたが直面している問題は、LogCat トレースで確認できる次の例外に関係しています。

Caused by: android.os.NetworkOnMainThreadException

それが何を意味するかは、名前から簡単に推測できます。メイン UI スレッドでネットワーク コードを実行しないでください。解決策:そのための独自のスレッドを開始します(このAndroid 開発者の記事を参照してください)。

なんで?

ネットワーク コードの実行には「長い時間」(数秒と想定) がかかる場合があります。メイン スレッドですべてのネットワーク コードを呼び出すと、その間に UI がフリーズします (これは、ご想像のとおり、あまり望ましくなく、ANR 例外が発生する可能性があり、発生する可能性があります)。

問題に関連する次の質問も参照してください。

于 2013-02-25T11:24:36.717 に答える