2015-08-09 4 views
-1

У меня есть простой код в моем сервере, который ожидает клиент для подключения на порт 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 правильным, что я должен делать, чтобы мой сервер прослушивал многие порты? Если нет, то какой лучший способ для моего сервера принимать многие порты?

+1

Вы уверены, что понимаете, как ServerSocket предназначен для работы? Вы понимаете, что при подключении Socket через ServerSocket это соединение переносится на другой порт, чтобы ServerSocket мог продолжать слушать. Если вы это понимаете, то могу ли я спросить: почему вы хотите запустить серверный сервер на нескольких портах? – ControlAltDel

+0

@ControlAltDel Я все еще довольно новичок в кодировании, поэтому я, вероятно, не совсем понимаю все полностью. В принципе, у меня есть приложение для Android. Поэтому, если ClientA хочет поговорить с ClientB, они пройдут через localport 4444. И тогда, если ClientC хочет поговорить с ClientD, они будут через localport 5555. – Pam

+0

@EJP Что бы вы предложили вместо этого, поскольку я использую TCP-сокеты? Я смущен тем, что, если ClientA хочет поговорить с ClientB, они могут оба подключиться через localport444. И если ClientC хочет напрямую поговорить с ClientD, то они могут сделать это на localport5555. По крайней мере, это имеет для меня смысл ... спасибо! – Pam

ответ

1

Я не знаю, почему вы думаете, что это нужно, но ваша ошибка компиляции должна быть решена следующим образом:

ServerSocketChannel server = (ServerSocketChannel)key.channel(); 
SocketChannel client = server.accept(); 
1

Существует очевидная ошибка в коде ...

SocketChannel client = server.accept(); //SERVER CANNOT BE RESOLVED!!!! 

Как уже упоминалось @EJP, он должен был бы быть заменен ...

ServerSocketChannel server = (ServerSocketChannel)key.channel(); 
SocketChannel client = server.accept(); 

Однако, пока вы can использовать порты, чтобы отличать клиентов, если вы думаете об этом на секунду, он не масштабируется. Вы сразу ограничиваете количество клиентов количеством доступных портов. Что еще хуже, вы запрещаете другим приложениям использовать эти порты (возможно, все доступные порты). Как отмечалось в @EJP, вам необходимо определить соответствующий протокол по сокетам.

Возможно, вы захотите взглянуть на разъемы java tutorial. Он не входит в NIO, но он даст общее представление о том, как это обычно делается.

Смежные вопросы