我的服务器中有一些简单的代码,等待客户端连接端口4444
try {
serverSocket = new ServerSocket(4444);
} catch (IOException e) {
//blah
}
while (true) {
try {
clientSocket = serverSocket.accept();
//do something
} catch (IOException ex) {
//blah
}
我现在要扩展以让我的服务器在10个不同的端口上侦听。起初我看的是for (int i = 4444; i < 4454; i++)
之类的内容,但这种方式无法正常运作。
现在我正在研究Java NIO ServerSocketChannel。我在网上找到了这个代码(感谢@Dunes!)
Selector selector = Selector.open();
int[] ports = {4000,4001,6000};
for (int port : ports) {
ServerSocketChannel server = ServerSocketChannel.open();
server.configureBlocking(false);
server.socket().bind(new InetSocketAddress(port));
// we are only interested when accept evens occur on this socket
server.register(selector, SelectionKey.OP_ACCEPT);
}
while (selector.isOpen()) {
selector.select();
Set readyKeys = selector.selectedKeys();
Iterator iterator = readyKeys.iterator();
while (iterator.hasNext()) {
SelectionKey key = (SelectionKey) iterator.next();
if (key.isAcceptable()) {
SocketChannel client = server.accept(); //SERVER CANNOT BE RESOLVED!!!!
Socket socket = client.socket();
// create new thread to deal with connection (closing both socket and client when done)
}
}
}
但是我无法执行它。在while (iterator.hasNext())
块上,server
中的server.accept
表示&#34;服务器无法解析&#34;。这是为什么? NIO ServerSocketChannel
我认为让我的服务器在许多端口上监听是正确的吗?如果没有,那么我的服务器接受多个端口的最佳方法是什么?
答案 0 :(得分:1)
我不知道为什么你认为你需要这个,但你的编译错误应解决如下:
ServerSocketChannel server = (ServerSocketChannel)key.channel();
SocketChannel client = server.accept();
答案 1 :(得分:1)
您的代码中存在明显错误...
Seat
如@EJP所述,它需要替换为......
SocketChannel client = server.accept(); //SERVER CANNOT BE RESOLVED!!!!
但是,当您可以使用端口来区分客户端时,如果您考虑它一秒钟,它就不会扩展。您可以立即将客户端数量限制为可用端口数。更糟糕的是,你阻止其他应用程序使用这些端口(可能是所有可用的端口)。正如@EJP所提到的,您需要在套接字上定义适当的协议。
您可能需要查看java套接字tutorial。它没有进入NIO,但它会给出这些事情通常如何完成的基本概念。