У меня есть простой код в моем сервере, который ожидает клиент для подключения на порт 4444Java - сервер прослушивает многие порты
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
говорит, что «сервер не может быть разрешен». Почему это? Является ли NIO ServerSocketChannel
правильным, что я должен делать, чтобы мой сервер прослушивал многие порты? Если нет, то какой лучший способ для моего сервера принимать многие порты?
Вы уверены, что понимаете, как ServerSocket предназначен для работы? Вы понимаете, что при подключении Socket через ServerSocket это соединение переносится на другой порт, чтобы ServerSocket мог продолжать слушать. Если вы это понимаете, то могу ли я спросить: почему вы хотите запустить серверный сервер на нескольких портах? – ControlAltDel
@ControlAltDel Я все еще довольно новичок в кодировании, поэтому я, вероятно, не совсем понимаю все полностью. В принципе, у меня есть приложение для Android. Поэтому, если ClientA хочет поговорить с ClientB, они пройдут через localport 4444. И тогда, если ClientC хочет поговорить с ClientD, они будут через localport 5555. – Pam
@EJP Что бы вы предложили вместо этого, поскольку я использую TCP-сокеты? Я смущен тем, что, если ClientA хочет поговорить с ClientB, они могут оба подключиться через localport444. И если ClientC хочет напрямую поговорить с ClientD, то они могут сделать это на localport5555. По крайней мере, это имеет для меня смысл ... спасибо! – Pam