2014-11-29 3 views
1

클라이언트를 여러 서버에 연결하고 그 중 하나에서 첫 번째 응답을 수신하려고합니다. 그래서 select를 사용하기로 결정했습니다. 나는 각 서버마다 하나의 소켓을 만들었고 소켓에 셀렉터를 등록했다. 그러나 그것은 효과가 없었습니다. 내 코드에 문제가있는 곳은 다음과 같습니다.JAVA : 클라이언트 측에서 select 사용

 Selector selector = Selector.open();// 
     int i; 
     for(i=0;i<serveurs.size();i++)//I have an arraylist of servers 
     { 
      Socket s=new Socket(serveurs.get(i).getIP(),port);//creating a socket with the server number i 

      sc=s.getChannel();//here's the problem: sc is null 
      sc.configureBlocking(false);//exception here because sc=null 
      sc.register(selector, SelectionKey.OP_READ);//register the socket channel to recieve data form the server 

     } 
     selector.select(); 
     // reading data in the socket registered in the selector 

그래서이 문제를 해결하려면 어떻게해야합니까?

답변

0

"TCP/IP Sockets in Java, 2nd Edition" 책을 새로 고침하면 시간 서버 및 클라이언트가 재생 중입니다. TcpTimeClient.java의 작은 데모 코드는 기본적으로 사용자가 설명하는 것을 수행합니다.

문제 난 당신의 코드에서 볼 수 있습니다

  1. 가 SocketChannel에를 얻으려면, SocketChannel.open()를 사용합니다. Socket.getChannel()의 JavaDoc은 수행 할 작업을 지시합니다.
  2. 관심 분야 OP_CONNECT를 사용하여 모든 연결을 먼저 시도한 다음 관심 분야 OP_READ를 사용하여 수상자를 찾습니다.

    1. 않도록 교착 상태, 예를 들면 : 응용 프로그램 프로토콜에 따라

    우려 서버가 응답하기 전에 클라이언트에서 메시지 읽기를 기대하고 클라이언트가 메시지를 쓰지 않고 응답을 기다리는 경우.

  3. 첫 번째 수상자가 최선이 아닐 수도 있습니다. 다른 QoS 접근 방식을 고려해보십시오. 또는 모든 연결을 열린 상태로 유지하고 필요한 경우 전환하십시오.
관련 문제