0

セレクターとチャネルを使用して、1つのスレッドだけでマルチクライアントサーバーを作成できることを読みました。機能をテストするための簡単なスケッチを作成しましたが、接続ごとにソケットデータしか処理できないようです...つまり、最初のクライアントが接続され、別のクライアントが接続した場合、サーバーはそれを処理しません...助けになりますか?最終的に、サーバーが複数のクライアントをリッスンしたいので、各クライアントは接続してデータを送受信できるようになりますサーバーとの間でサーバーが書き込みを送信する場合:Client[num]はこのデータを送信しました"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();
                    }
                }




            }
        }
    }

読み取りクライアントストリームは、単なる標準のバイトバッファです。

4

1 に答える 1

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 

            }
于 2013-02-08T12:43:23.633 に答える