2016-08-14 2 views
0

두 대의 휴대 기기간에 Wi-Fi를 사용하여 통신하고 있습니다. 메시지를 보내고받을 수있는 설치 소켓이 있습니다. 서버 장치 (소유자)를 시작한 다음 클라이언트 장치 (구성원)를 시작하면 모든 것이 잘 작동합니다. 순서에 관계없이 모든 장치를 시작하고 메시지를 계속 보내고 싶습니다.클라이언트가 서버 소켓 연결을 기다리는 것을 어떻게 만드나요?

현재 클라이언트는 5 초 동안 대기하고 연결이 가능하지 않으면 서버 찾기를 중지합니다. 클라이언트가 서버 연결을 찾을 때까지 시간 초과 후에도 서버를 계속 찾고 싶습니다. 나는 이것을 시도하고 아직 이것을 성공적으로 구현하지 못했습니다.

초기 클라이언트 코드 : 내 코드에

@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(); 
      } 
     } 
    } 

누락 무엇 :

@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; 
     } 
    } 

다음과 같이 수정? 어떻게 작동시킬 수 있습니까?

나는 계속이 오류를 얻고있다 :

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()마다 시간을 만들어야합니다. 원격 서버에 연결하지 못하면 이후 사용을 위해 소켓이 무효화됩니다. 안드로이드에서 이것을 실행하고 있기 때문에 connect을 두 번 호출하려고 할 때 "소켓을 닫았습니다"오류가 표시되지 않는 것 같습니다.

@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

관련 문제