3

わかりましたので、私はそれが非常に簡単であるように思われることをしています。私は基本的に ServerSocket 接続を開こうとしていて、クライアントが接続するのを待ちます。

これが私のコードです。

ServerSocket serverSocket = new ServerSocket(6543);
Socket clientSocket = serverSocket.accept();

私のコードが serverSocket.accept(); にヒットするたびに、次の例外をスローしています。

bind failed: EADDRINUSE (Address already in use)

したがって、明らかに私の次のステップは、別のポートが機能するかどうかを確認することでしたが、機能しませんでした。次に、デバイスを再起動してアプリを実行しようとしましたが、同じ例外が発生しました。アプリに INTERNET 権限を付与し、デバイスをルート化しました。

表示されるネットワーク インターフェイスは次のとおりです。

lo: ::1%1
lo: 127.0.0.1
eth0: //IPV6 address 
eth0: 192.168.1.127

編集1

これは、デバッグ時に取得した serverSocket オブジェクト情報です。

ServerSocket[addr=192.168.1.121/192.168.1.121,port=0,localport=1234]

編集2

ServerSocket に次の利用可能なコンストラクターがあります

new ServerSocket(int port)
new ServerSocket(int port, int backlog)
new ServerSocket(int port, int backlog, InetAddress localAddress)

3番目のコンストラクターと同じ例外を使用してみました。

new ServerSocket(4567, 0, InetAddress.getLocalHost());
4

1 に答える 1

1

さて、アプリケーションが例外をスローした理由と、これについてフィードバックがあるか、なぜこれが起こったのかについて答えを提供したい人がいるかどうかを最終的に理解しました。大変ありがたく存じます。

したがって、私が作成したスレッドでは、サーバー接続で何が起こっているかに基づいていくつかの TextView を更新するために、メイン スレッドにポストバックする必要があります。自分で作成したスレッドからメイン スレッドを更新できないため、UI を更新するためにそのスレッドに Handler オブジェクトを追加する必要がありました。その Handler を完全に削除すると、アプリケーションは例外をスローすることなく ServerSocket を正常に作成できました。

ハンドラーは何らかの方法で事前にコードを実行しますか、それともここで何が起こっていましたか?

コード。

RemoteServerRunnable test = new RemoteServerRunnable();
Handler handler = new Handler();
handler.post(test);
test.start();
于 2012-10-14T23:07:04.730 に答える