【问题标题】:Java multi client server with selectors带有选择器的 Java 多客户端服务器
【发布时间】:2013-02-08 12:21:11
【问题描述】:

我已经读到可以使用选择器和通道创建一个只有一个线程的多客户端服务器。我做了一个快速草图来测试功能,它似乎只能处理每个连接的套接字数据......我的意思是第一个客户端连接并且服务器正在等待来自它的数据包如果另一个客户端连接它不处理它...任何帮助?作为最终结果我希望我的服务器监听多个客户端每个客户端将能够连接发送并从服务器接收数据,因此如果它发送服务器写入:Client[num] sent this data"data'

代码如下:

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




            }
        }
    }

读取的客户端流只是一些标准的字节缓冲区。

【问题讨论】:

  • 我对 SocketChannel 或 Selectors 了解不多。但是如果要开发一个多客户端、事件驱动的套接字应用程序,我建议你使用 Netty (netty.io)。

标签: java sockets nio


【解决方案1】:

您没有清除已选择的SelectionKeys。修改代码如下

            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 

            }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-07
    • 2016-04-09
    • 2020-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多