带选择器的Java多客户端服务器

时间:2013-02-08 12:21:12

标签: java sockets nio

我已经读过可以使用选择器和channels创建一个只有一个线程的多客户端服务器。我做了一个快速草图来测试功能,似乎它只能处理每个连接的套接字数据...我的意思是第一个连接的客户端和服务器等待来自它的数据包,如果另一个客户端连接它没有处理它...任何帮助?作为最终结果我想我的服务器听多个客户端每个客户端将能够连接发送并从服务器接收数据,如果它发送服务器写入:客户端[num]发送此数据“数据”

继承人代码:

public static void Startnio() throws Exception
    {
        ServerSocketChannel ServerChannel = ServerSocketChannel.open();
        ServerChannel.configureBlocking(false);
        ServerSocket Server = ServerChannel.socket();
        Server.bind(new InetSocketAddress(port));
        Selector selector = Selector.open();
        ServerChannel.register(selector, SelectionKey.OP_ACCEPT);
        System.out.println("Server began listening on port: " + port);

        while (true)
        {
            int num = selector.select();
            if (num == 0)
            {
                continue;
            }
            Set keys = selector.selectedKeys();
            Iterator it = keys.iterator();
            while (it.hasNext())
            {
                SelectionKey key = (SelectionKey) it.next();
                if ((key.readyOps() & SelectionKey.OP_ACCEPT) == SelectionKey.OP_ACCEPT)
                {
                    Socket Client = Server.accept();
                    count++;
                    System.out.println("Client Connected...." + "you have " + count + " clients connected");
                    SocketChannel ClientChannel = Client.getChannel();
                    ClientChannel.configureBlocking(false);
                    ClientChannel.register(selector, SelectionKey.OP_READ);//read incoming stream
                }
                else
                {
                    if ((key.readyOps() & SelectionKey.OP_READ) == SelectionKey.OP_READ)
                    {
                        SocketChannel Client = null;
                        Client = (SocketChannel) key.channel();
                        client=Client;
                        ReadClientStream();
                    }
                }




            }
        }
    }

读取客户端流只是一些标准的bytebuffer。

1 个答案:

答案 0 :(得分:0)

您尚未清除已选择的SelectionKey。将代码更改为以下

            while (it.hasNext()) {
                SelectionKey key = (SelectionKey) it.next();
                if ((key.readyOps() & SelectionKey.OP_ACCEPT) == SelectionKey.OP_ACCEPT) {
                    Socket Client = Server.accept();

                    count++;
                    System.out.println("Client Connected...." + "you have "
                            + count + " clients connected");
                    SocketChannel ClientChannel = Client.getChannel();
                    ClientChannel.configureBlocking(false);
                    ClientChannel.register(selector, SelectionKey.OP_READ);// read
                                                                            // incoming
                                                                            // stream
                } else {
                    if ((key.readyOps() & SelectionKey.OP_READ) == SelectionKey.OP_READ) {
                        SocketChannel Client = null;
                        Client = (SocketChannel) key.channel();
                        // client=Client;
                        // ReadClientStream();
                    }
                }
                it.remove(); // Add this to Remove Already Selected SelectionKeys 

            }