54 votes

Les sockets Java prennent-ils en charge le duplex intégral?

Est-il possible d’écrire un thread sur le OutputStream d’un Java Socket , pendant qu’un autre lit le InputStream du socket, sans que les threads aient à se synchroniser sur le prise?

47voto

jefflunt Points 20244

Assurez-vous. La situation que vous décrivez ne devrait pas être un problème (de la lecture et de l'écriture en même temps).

Généralement, le thread de lecture se bloque si il n'y a rien à lire, et peut-délai de l'opération de lecture si vous avez un délai spécifié.

Depuis le flux d'entrée et les flux de sortie sont des objets distincts à l'intérieur de la Douille, la seule chose que vous risquez de vous en préoccuper, ce qui arrive si vous avez eu 2 fils en essayant de lire ou d'écrire (deux fils, même d'entrée/sortie de courant) en même temps? La lecture/écriture des méthodes de l'InputStream/OutputStream classes ne sont pas synchronisés. Il est possible, cependant, que si vous êtes en utilisant une sous-classe de InputStream/OutputStream, que la lecture/écriture de méthodes que vous appelez sont synchronisés. Vous pouvez consulter la javadoc pour quelle que soit la classe, les méthodes que vous l'appelez, et de trouver que assez rapide.

9voto

Paul Cager Points 1577

Oui c'est sûr.

Si vous voulez que plus d'un thread lise à partir de InputStream, vous devrez être plus prudent (en supposant que vous lisiez plus d'un octet à la fois).

2voto

Adam Gent Points 15055

Dans des moments comme cela, je trouve qu'il vaut mieux aller regarder le code source:

AbstractSocketImpl

À partir du code, vous pouvez voir comme mentionné par d'autres, un InputStream et OutputStream sont créés ceux qui maintiennent leur propre état, de sorte que vous devez être à l'aise aussi bien en lecture/écriture avec deux threads.

SocketInputStream

Cependant, comme mentionné précédemment, vous pouvez clairement dire sa une mauvaise idée d'avoir deux threads de lecture à partir de la même flux d'entrée (eof n'est pas synchronisé).

Par @SoftwareMonkey présumées de suggestion, il peut être préférable de poster cette question à un officiel de Java (Oracle) forum à ce que l' corriger contrat.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X