セレクターとチャネルを使用して、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();
}
}
}
}
}
読み取りクライアントストリームは、単なる標準のバイトバッファです。