2015-08-09 1 views
-1

j'ai un code simple dans mon serveur qui attend un client de se connecter sur le port 4444Java - Server écoute sur de nombreux ports

try { 
    serverSocket = new ServerSocket(4444); 
    } catch (IOException e) { 
    //blah 
} 

while (true) { 
    try { 
    clientSocket = serverSocket.accept(); 
    //do something 
} catch (IOException ex) { 
    //blah 
} 

je maintenant ce qu'il faut étendre à avoir mon serveur écouter sur 10 ports différents. Au début, je regardais quelque chose comme: for (int i = 4444; i < 4454; i++) mais cela ne fonctionnait pas correctement.

Maintenant, je cherche dans Java NIO ServerSocketChannel. J'ai trouvé ce code en ligne (merci @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) 
     } 
    } 
} 

Mais je ne peux pas l'exécuter. Sur le bloc while (iterator.hasNext()), server dans server.accept indique que "le serveur ne peut pas être résolu". Pourquoi donc? Est-ce que NIO ServerSocketChannel est ce que je suis supposé faire pour que mon serveur écoute sur de nombreux ports? Si non, quelle est la meilleure méthode pour que mon serveur accepte de nombreux ports?

+1

Etes-vous sûr de comprendre comment ServerSocket est conçu pour fonctionner? Vous comprenez que lorsqu'une connexion Socket est établie via une ServerSocket, cette connexion est déplacée vers un autre port afin que ServerSocket puisse continuer à écouter. Si vous comprenez cela, puis-je demander: Pourquoi voulez-vous exécuter votre ServerSocket sur plusieurs ports? – ControlAltDel

+0

@ControlAltDel Je suis encore assez novice en matière de codage, donc je ne comprends probablement pas tout à fait entièrement. Fondamentalement, j'ai une application de discussion Android. Donc, si ClientA veut parler à ClientB, ils le feront via localport 4444. Et puis, si ClientC veut parler à ClientD, ils le feront via localport 5555. – Pam

+0

@EJP Que me suggérerais-je de faire, puisque j'utilise les sockets TCP? Je suis confus dans le fait que si ClientA veut parler à ClientB, ils peuvent se connecter via localport444. Et si ClientC veut parler directement à ClientD, alors ils peuvent le faire sur localport5555. Au moins, cela a plus de sens pour moi ... merci! – Pam

Répondre

1

Je ne sais pas pourquoi vous pensez que vous avez besoin, mais votre erreur de compilation devrait être réglée comme suit:

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

Il y a une erreur évidente dans votre code ...

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

Comme @EJP mentionné, il devrait être remplacé par ...

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

Cependant, alors que vous peut utiliser les ports pour distinguer les clients, si vous y réfléchissez une seconde, il n'est pas à l'échelle. Vous limitez immédiatement le nombre de clients au nombre de ports disponibles. Pire encore, vous empêchez les autres applications d'utiliser ces ports (éventuellement tous les ports disponibles). Comme @EJP l'a également mentionné, vous devez définir un protocole approprié sur les sockets.

Vous voudrez peut-être jeter un coup d'œil aux prises Java tutorial. Il ne va pas dans NIO, mais il donnera une idée de base de la façon dont ces choses sont normalement faites.