JAVA:在客户端使用select

时间:2014-11-29 13:12:43

标签: java sockets

我想将客户端连接到多个服务器,并从其中一个服务器接收第一个答案。所以我决定使用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

那么我该怎么做才能解决这个问题?

1 个答案:

答案 0 :(得分:0)

刷新书籍"TCP/IP Sockets in Java, 2nd Edition"遇到时间服务器和客户端。 TcpTimeClient.java的小型演示代码基本上就是你所描述的。

我可以在您的代码中看到的问题:

  1. 要获取SocketChannel,请使用SocketChannel.open()。 Socket.getChannel()的JavaDoc告诉我们该做什么。
  2. 使用兴趣OP_CONNECT先尝试所有连接,然后使用兴趣OP_READ查找获胜者。
  3. 关注取决于申请协议:

    1. 避免死锁,例如如果服务器期望在响应之前从客户端读取消息,并且客户端只是等待响应而不先写入消息。
    2. 第一个获胜者可能不是最好的,考虑任何其他QoS方法。或者保持所有连接打开并在必要时进行切换。