/ / Vollduplex TCP Verbindung ohne NIO unmöglich? - Java, Steckdosen

Vollduplex-TCP-Verbindung ohne NIO unmöglich? - Java, Sockets

Ich habe zwei separate Java-Prozesse, die über eine einzige TCP-Verbindung kommunizieren. Das Protokoll ist nicht eine einfache synchrone Anfrage / Antwort gefälltHTTP. Beide Seiten können unabhängig voneinander Anfragen einleiten und Daten senden. Ich möchte dies mithilfe von Threads und blockierenden Sockets implementieren und dabei NIO vermeiden. Aber ist das überhaupt möglich?

Java-Sockets (java.net.Socket) sind nicht threadsicher, daher darf ich nicht in einem Thread aus dem Socket lesen, während ich gleichzeitig in einen anderen Thread schreibe. (Stimmt das?) Diese Einschränkung führt offensichtlich zu Deadlocks, wenn beide Seiten blockiert sind Schreiben an die Steckdose.

Daraus folgt, dass bestimmte Protokolle auf TCP nicht in Java implementiert werden können, ohne NIO zu verwenden, oder fehlt mir ein Punkt?

Vielen Dank.

Antworten:

4 für die Antwort № 1

Vollduplex-Kommunikation ist durchaus möglich. Ohne NIO benötigen Sie einen Thread, um aus dem Socket zu lesen (und die angeforderte Verarbeitung durchzuführen). In der Zwischenzeit kann ein anderer Thread in denselben Socket schreiben.

Wenn Sie auf einige Dokumente hinweisen können, die darauf hindeuten, dass Sockets nicht vollduplex sind, werde ich versuchen, dies zu klären.


1 für die Antwort № 2

Ich weiß nicht, wo Sie diese Java-Sockets gelesen habensind in der Regel thread-unsicher. Es ist nicht möglich, dass mehrere Threads gleichzeitig aus den Streams des Sockets schreiben oder lesen. Es gibt jedoch keinen Grund, warum Sie nicht das Schreiben von Threads in den OutputStream des Sockets und ein anderes Lesen von Threads aus dem InputStream des Sockets durchführen können.


0 für die Antwort № 3

Sockets sind threadsicher, so dass es kein Problem gibtmit der Verwendung mehrerer Threads, einer zum Lesen und einer zum Schreiben. Wenn Sie jedoch mehrere Threads vermeiden möchten, müssen Sie den Socket-Eingabestream abfragen, um festzustellen, ob regelmäßig Daten eingehen, während Sie ausgehende Vorgänge ausführen.