2016-08-14 15 views
0

私は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) 
+0

関連する質問:http://stackoverflow.com/questions/7312794/retry-a-connection-on-timeout-in-javaまた、 'catch'ではなく、' finally'ブロック内で 'socket.close()'を呼び出す必要があります。 – user991710

+0

私はもう一度試しました..私はこれを取得しています:例外java.io.IOException:fcntlが失敗しました:EBADF(不正なファイル番号) – NewOne

答えて

0

あなたはnew Socket()を毎回作成する必要があります。リモートサーバーへの接続に失敗すると、それ以降の使用のためにソケットが無効になります。 Androidでこれを実行しているので、connectを2回呼び出すときに「ソケットが閉じた」というエラーが表示されていないようです。

@Override 
public void run() 
{ 
    connector: while (true) 
    { 
     Socket socket = new Socket(); 

     try 
     { 
      socket.connect(new InetSocketAddress("0.0.0.0", 9999), 2000); 
      this.doSomethingElseWithConnectedSocket(socket); 
      break connector; // break out of the while loop 
     } 
     catch (ConnectException e) 
     { 
      // ignore because worthless 
     } 

     try 
     { 
      socket.close(); 
     } 
     catch(Throwable x) 
     { 
      // ignore 
     } 

     System.out.println("Unable to connect to server "); 

     try 
     { 
      Thread.sleep(1000); 
     } 
     catch (InterruptedException e1) 
     { 
      // ignore 
     } 
    } 
} 

public void doSomethingElseWithConnectedSocket(Socket value) 
{ 
    value.close(); // close for no good reason 
} 
+0

ありがとうございます。それは働いている。もう一つ質問があります。ここでソケットを閉じるにはどうしたらいいですか?私はどこに置くべきですか? – NewOne

+0

いつでもどこからでもソケットを閉じることができます。 'doSomethingElseWIthConnectedSocket()'の中に 'value.close()'を入れることができます。 –

+0

Ok。ありがとうございました – NewOne

関連する問題