我正在开发一个套接字侦听器,它必须侦听 2 个端口上的 2 种类型的数据(端口 80 和端口 81)。这些数据与对数据执行的操作类型非常相似,只是因为它们到达 n 个不同的端口而有所不同。我继续使用 Java 的 ServerSocket 类编写了一个实现,后来才意识到 ServerSocket 类的 accept() 方法是阻塞的,而我的实现无法承受这种情况。所以现在我正在考虑使用 Java NIO 实现相同的功能,但是在阅读了一些教程之后,我认为我比开始时更困惑。如果这里有人能引导我完成整个过程,即使是伪代码或只是技术性的“下一步做什么”,那就太好了。
这就是我计划实现的目标。
通过调用 2 个相似的线程,永远在 2 个端口上监听。(非阻塞)
来自某个网络位置的远程设备连接、发送数据,然后断开连接。
我认为,如果仅了解如何使用 NIO 来设置服务器来侦听本地主机上的端口(例如端口 80),那么其余的都很容易实现。
Cheers
这里有一个开始使用 NIO 的小例子。
它是一个监听端口 80 和 81 并打印在标准输出上接收到的所有内容的服务器。连接在收到以以下开头的数据包后关闭CLOSE
;收到以以下开头的数据包后,整个服务器将关闭QUIT
。缺少发送部分和错误处理可能会好一点。 :-)
public static void main() throws IOException {
ByteBuffer buffer = ByteBuffer.allocate(1024);
Selector selector = Selector.open();
ServerSocketChannel server1 = ServerSocketChannel.open();
server1.configureBlocking(false);
server1.socket().bind(new InetSocketAddress(80));
server1.register(selector, OP_ACCEPT);
ServerSocketChannel server2 = ServerSocketChannel.open();
server2.configureBlocking(false);
server2.socket().bind(new InetSocketAddress(81));
server2.register(selector, OP_ACCEPT);
while (true) {
selector.select();
Iterator<SelectionKey> iter = selector.selectedKeys().iterator();
while (iter.hasNext()) {
SocketChannel client;
SelectionKey key = iter.next();
iter.remove();
switch (key.readyOps()) {
case OP_ACCEPT:
client = ((ServerSocketChannel) key.channel()).accept();
client.configureBlocking(false);
client.register(selector, OP_READ);
break;
case OP_READ:
client = (SocketChannel) key.channel();
buffer.clear();
if (client.read(buffer) != -1) {
buffer.flip();
String line = new String(buffer.array(), buffer.position(), buffer.remaining());
System.out.println(line);
if (line.startsWith("CLOSE")) {
client.close();
} else if (line.startsWith("QUIT")) {
for (SelectionKey k : selector.keys()) {
k.cancel();
k.channel().close();
}
selector.close();
return;
}
} else {
key.cancel();
}
break;
default:
System.out.println("unhandled " + key.readyOps());
break;
}
}
}
}
Obs: 的领域SelectionKey
(OP_ACCEPT
...) 是静态导入的:
import static java.nio.channels.SelectionKey.*;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)