私は2つのモバイルデバイス間で通信するためにwifi directを使用しています。私はメッセージを送受信するセットアップソケットを持っています。サーバーデバイスを最初に(所有者)起動し、次にクライアントデバイス(メンバ)を起動すると、すべて正常に動作します。私は任意のデバイスを任意の順序で起動し、依然としてメッセージを送信したいと考えています。クライアントがサーバーソケット接続を待つ方法を教えてください。
現在、クライアントは5秒間待機し、使用可能な接続がない場合は、サーバーの検索を停止します。私は、クライアントがサーバ接続を見つけるまでタイムアウトした後でもサーバを探し続けることを望みます。私はこれをやってみましたが、これをまだ実行していません。
初期クライアントコード:
次のように変更された@Override
public void run() {
Socket socket = new Socket();
try {
socket.bind(null);
socket.connect(new InetSocketAddress(address.getHostAddress(), SERVER_PORT), TIME_OUT);
socketCreator = new SocketCreator(socket, handler);
new Thread(socketCreator).start();
} catch (IOException e) {
e.printStackTrace();
try {
socket.close();
} catch (IOException e1) {
e1.printStackTrace();
}
return;
}
}
:
私のコードに欠けている何@Override
public void run() {
Socket socket = new Socket();
try {
socket.setReuseAddress(true);
socket.bind(null);
while(!connectedToServer) {
try {
socket.connect(new InetSocketAddress(address.getHostAddress(), SERVER_PORT),
TIME_OUT);
socketCreator = new SocketReadWriter(socket, handler);
new Thread(socketCreator).start();
connectedToServer = true;
} catch (ConnectException e) {
Log.i(TAG,"Error while connecting. " + e.getMessage());
try {
Thread.sleep(2000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
} catch (Exception e){
Log.i(TAG,"Exception "+e.getMessage());
}
}
} catch (IOException e) {
e.printStackTrace();
try {
socket.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
?どうすればそれを動作させることができますか?
私は継続的にこのエラーを取得しています:
Exception java.io.IOException: fcntl failed: EBADF (Bad file number)
関連する質問:http://stackoverflow.com/questions/7312794/retry-a-connection-on-timeout-in-javaまた、 'catch'ではなく、' finally'ブロック内で 'socket.close()'を呼び出す必要があります。 – user991710
私はもう一度試しました..私はこれを取得しています:例外java.io.IOException:fcntlが失敗しました:EBADF(不正なファイル番号) – NewOne