Comment faire un acceptées socket non bloquant en java
Je suis accepter une connexion à partir d'un client, puis en passant, que les socket connecté à un autre objet, cependant, que la prise doit être non-bloquant. Je suis en train d'utiliser getChannel().configureBlocking(false)
mais cela ne semble pas fonctionner. Il doit être non-bloquant, car cette méthode est appelée ci-dessous toutes les 100ms. Est-il un autre moyen que je devrais faire cette non-bloquant? Merci pour toute aide!
public void checkForClients() {
DataOutputStream out;
DataInputStream in;
Socket connection;
InetAddress tempIP;
String IP;
try {
connection = serverSocket.accept();
connection.getChannel().configureBlocking(false);
System.err.println("after connection made");
in = new DataInputStream(connection.getInputStream());
out = new DataOutputStream(connection.getOutputStream());
tempIP = connection.getInetAddress();
IP = tempIP.toString();
System.err.println("after ip string");
//create a new user ex nihilo
connectedUsers.add(new ConnectedUser(IP, null, connection, in, out));
System.err.println("after add user");
} catch (SocketTimeoutException e) {
System.err.println("accept timeout - continuing execution");
} catch (IOException e) {
System.err.println("socket accept failed");
}
}
Cette question est posée dans ce fil stackoverflow.com/questions/15541804/.... La réponse est de mettre le serveur de socket dans son propre thread.
OriginalL'auteur Benaiah | 2009-11-09
Vous devez vous connecter pour publier un commentaire.
Deux choses:
ServerSocket
si vous êtes à l'écoute pour les connexions?La structure de base d'un serveur multi-clients est:
Si le problème est le blocage sur le
accept()
appel, c'est bien ce queaccept()
n': il bloque en attente d'une connexion. Si c'est un problème, je vous suggère d'avoir un thread séparé pour accepter les connexions.Voir L'écriture de la partie Serveur de Socket.
Il y a n'est pas une réponse, que vous ne pouvez pas le faire sans se déplacer à NIO.
OriginalL'auteur cletus
Je m'attends votre code bloquer sur la accepter l'appel, de ne jamais arriver à la configureBlocking appel.
En général, je spin-off d'un thread séparé pour chaque connexion de socket, et laissez-le bloc jusqu'à ce qu'une connexion est en fait/Cela permet au thread principal pour continuer débloqué alors qu'il est en attente pour les connexions client.
OriginalL'auteur simon
Si vous êtes à la recherche pour les non-bloquant sokets, ma suggestion est d'utiliser des Sélecteurs et ServerSocketChannels avec le NIO paquet.
http://java.sun.com/j2se/1.4.2/docs/guide/nio/
OriginalL'auteur Seth
Si typique de blocage de la douille de ne pas vous donner la disponibilité dont vous avez besoin (une connexion à chaque 100ms semble serré). Vous devriez regarder un socket non bloquant. Voici un tutoriel. Vous pouvez aussi regarder Apache MINA pour rendre cela plus facile.
OriginalL'auteur Yishai
Une approche consiste à utiliser un I/O loop (boucle) dans un seul thread de l'environnement. Jetez un oeil à Habile serveur web pour l'inspiration. (En particulier la méthode start() dans IOLoop)
OriginalL'auteur Schildmeijer