侦听多个套接字(InputStreamReader)是指在一个程序中同时处理多个网络连接的情况。在这种情况下,通常需要使用多线程或异步I/O来处理多个套接字,以避免程序阻塞。
在Java中,可以使用java.nio
包中的Selector
和Channel
类来实现侦听多个套接字。Selector
可以同时监控多个Channel
的状态,当某个Channel
准备好读或写时,Selector
会通知程序进行处理。这样可以实现高效的I/O操作,避免了多线程或异步I/O的复杂性。
以下是一个简单的Java代码示例,演示如何使用Selector
和ServerSocketChannel
侦听多个套接字:
Selector selector = Selector.open();
ServerSocketChannel serverChannel = ServerSocketChannel.open();
serverChannel.configureBlocking(false);
ServerSocket serverSocket = serverChannel.socket();
InetSocketAddress address = new InetSocketAddress("localhost", 8080);
serverSocket.bind(address);
serverChannel.register(selector, SelectionKey.OP_ACCEPT);
while (true) {
selector.select();
Set<SelectionKey> selectedKeys = selector.selectedKeys();
Iterator<SelectionKey> keyIterator = selectedKeys.iterator();
while (keyIterator.hasNext()) {
SelectionKey key = keyIterator.next();
if (key.isAcceptable()) {
ServerSocketChannel serverChannel = (ServerSocketChannel) key.channel();
SocketChannel clientChannel = serverChannel.accept();
clientChannel.configureBlocking(false);
clientChannel.register(selector, SelectionKey.OP_READ);
} else if (key.isReadable()) {
SocketChannel clientChannel = (SocketChannel) key.channel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
int bytesRead = clientChannel.read(buffer);
if (bytesRead == -1) {
clientChannel.close();
key.cancel();
} else {
buffer.flip();
byte[] bytes = new byte[bytesRead];
buffer.get(bytes);
String message = new String(bytes, StandardCharsets.UTF_8);
System.out.println("Received message: " + message);
}
}
keyIterator.remove();
}
}
在这个示例中,我们首先创建了一个Selector
对象,并使用ServerSocketChannel
侦听本地的8080端口。然后,我们将ServerSocketChannel
注册到Selector
中,监听接受新的连接。当有新的连接到来时,我们会接受连接,并将新的SocketChannel
注册到Selector
中,监听读操作。当SocketChannel
有数据可读时,我们会读取数据并输出到控制台。
这个示例只是一个简单的演示,实际应用中可能需要更复杂的逻辑来处理多个套接字。但是,使用Selector
和Channel
可以让我们更高效地处理多个套接字,避免了多线程或异步I/O的复杂性。
领取专属 10元无门槛券
手把手带您无忧上云