Question

i écris simple application impliquant un serveur et de nombreux clients à la fois. je dois utiliser DatagramSocket. l'application est simple échange de messages via la console comme en bavardant. mais les deux opérations in.readLine () et ds.receive () sont de blocage et de les mettre dans des fils séparés n'a pas aidé le blocage i / o bloquera aussi le fil. tout organisme peut me dire comment puis-je faire sans nio

Était-ce utile?

La solution

Si vous avez des fils qui sont dédiés uniquement à l'envoi ou la réception de données sur le réseau, puis enfilez le blocage ne sera pas un problème, car seul ce thread dédié sera bloqué.

Ensuite, nous allons examiner l'impact de cette solution sur le nombre de threads dans votre application:

  • Si vous avez seulement quelques clients par serveur, ayant 2 E / S threads par client est pas un problème.
  • Si vous avez beaucoup de clients par serveur, vous devez accepter le fait que certaines de leurs demandes seront traitées pas immédiatement, mais seulement alors thread de travail devient disponible. Vous pouvez essayer de reproduire autant d'E / S fils comme il y a des clients, mais il y a des limites sur le nombre de threads instance de machine virtuelle Java unique peut avoir. Les chiffres exacts dépendent de la taille du tas disponible à votre machine virtuelle Java et si votre architecture est 32bit ou 64bit, voir .

Si vous intéressé par une mission générale de gérer beaucoup de clients, ici est le papier web classique sur cette question.

Autres conseils

Tout d'abord, vous devez utiliser java.nio pour obtenir E / S non bloquant. En supposant que vous ne pouvez pas, pour une raison quelconque ...

Vous pouvez facilement vos données de poignée de serveur à partir de plusieurs clients à l'aide DatagramSocket et un travail en file d'attente, comme java.util.concurrent.ThreadPoolExecutor.

L'idée est que vous avez un seul fil de récepteur lecture de la douille, et chaque datagramme est reçu, enveloppé dans un objet « ReceivedDatagram » et tomber sur le travail en file d'attente. Le travail en file d'attente possède une piscine de fil dont les fils dequeue et traiter chaque paquet; si le paquet nécessite une réponse, le fil envoie la réponse (blocage) avant de bloquer à un autre dequeue ReceivedDatagram.

Pour envoyer des données de manière asynchrone, vous mettez simplement un objet « SendDatagram » sur le travail en file d'attente qui représente un DatagramPacket envoyer.

Notez que vous utiliserez Datagram.receive (DatagramPacket) et Datagram.send (DatagramPacket).

Vous pouvez le faire en faisant des opérations de blocage dans des threads séparés, en utilisant un fil ou mieux soit donné naissance à la main Enfilez Piscine (http://www.ibm.com/developerworks/library/j-jtp0730.html)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top