Java - 服务器侦听多个端口
Java - Server listens on many ports
我的服务器中有一些简单的代码等待客户端连接到端口 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.accept
中的 server
表示 "server cannot be resolved"。这是为什么? NIO ServerSocketChannel
让我的服务器监听多个端口是否正确?如果不是,我的服务器接受多个端口的最佳方法是什么?
我不知道你为什么认为你需要这个,但你的编译错误应该解决如下:
ServerSocketChannel server = (ServerSocketChannel)key.channel();
SocketChannel client = server.accept();
您的代码中存在明显错误...
SocketChannel client = server.accept(); //SERVER CANNOT BE RESOLVED!!!!
如@EJP 所述,需要将其替换为...
ServerSocketChannel server = (ServerSocketChannel)key.channel();
SocketChannel client = server.accept();
但是,虽然您可以使用端口来区分客户端,但如果您稍微考虑一下,它就无法扩展。您立即将客户端数量限制为可用端口的数量。更糟糕的是,您正在阻止其他应用程序使用这些端口(可能是所有可用端口)。正如@EJP 还提到的,您需要在套接字上定义适当的协议。
您可能想看一下 java 个插座 tutorial。它不会涉及 NIO,但会给出这些事情通常如何完成的基本概念。
我的服务器中有一些简单的代码等待客户端连接到端口 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.accept
中的 server
表示 "server cannot be resolved"。这是为什么? NIO ServerSocketChannel
让我的服务器监听多个端口是否正确?如果不是,我的服务器接受多个端口的最佳方法是什么?
我不知道你为什么认为你需要这个,但你的编译错误应该解决如下:
ServerSocketChannel server = (ServerSocketChannel)key.channel();
SocketChannel client = server.accept();
您的代码中存在明显错误...
SocketChannel client = server.accept(); //SERVER CANNOT BE RESOLVED!!!!
如@EJP 所述,需要将其替换为...
ServerSocketChannel server = (ServerSocketChannel)key.channel();
SocketChannel client = server.accept();
但是,虽然您可以使用端口来区分客户端,但如果您稍微考虑一下,它就无法扩展。您立即将客户端数量限制为可用端口的数量。更糟糕的是,您正在阻止其他应用程序使用这些端口(可能是所有可用端口)。正如@EJP 还提到的,您需要在套接字上定义适当的协议。
您可能想看一下 java 个插座 tutorial。它不会涉及 NIO,但会给出这些事情通常如何完成的基本概念。