Java-Netzwerk: Erklären Sie InputStream und OutputStream in Socket

7

Ich habe einen Server mit ServerSocket erstellt. Danach habe ich den Client mit Socket erstellt und eine Verbindung zu diesem Server hergestellt.

Danach mache ich "einige Sachen" mit InputStream und OutputStream wird aus dem Socket-Objekt genommen. Aber ich verstehe InputStream und outputStream nicht wirklich. Hier ist mein einfacher Code:

%Vor%

Das Ergebnis wird lauten: "Hello World" und "Hello StackOverFlow".

Hier ist der Server-Side-Code:

%Vor%

Meine Frage ist:

  1. Wenn ich sockOutput.write verwende, kann ich diese Nachricht wieder durch sockInput.read zurückbekommen. Also, diese Nachricht wurde gespeichert, oder? Wenn dies wahr ist, wird es auf dem Server gespeichert, den ich erstellt oder in einer anderen Sache wie Socket Object gespeichert habe.

  2. Wenn ich in die Buchse A1, A2, ... geschrieben habe, bekomme ich A1, A2, ... eine Zeichenfolge, oder?

hqt 03.10.2012, 19:18
quelle

2 Antworten

29

Ein Socket ist eine Abstraktion, die Sie verwenden, um mit etwas über das Netzwerk zu sprechen. Siehe Diagramm unten ...

Um in Java Daten über den Socket zu senden, erhalten Sie OutputStream (1) und schreiben in OutputStream (Sie geben einige Daten aus).

Um Daten vom Socket zu lesen, erhalten Sie ihr InputStream und lesen die Eingabe von diesem zweiten Datenstrom.

Sie können sich die Streams als ein Paar one-way Pipes vorstellen, die mit einem Socket an der Wand verbunden sind. Was auf der anderen Seite der Wand passiert, ist nicht dein Problem!

In Ihrem Fall hat der Server einen anderen Socket (das andere Ende der Verbindung) und ein anderes Paar von Streams. Er verwendet seine InputStream (2), um aus dem Netzwerk zu lesen, und seine OutputStream (3), um die gleichen Daten über das Netzwerk zurück zu Ihrem Client zu schreiben, der sie erneut über% liest. co_de% (4) die Rundreise beenden.

%Vor%

Aktualisiert: als Antwort auf den Kommentar:

Beachten Sie, dass die Streams und Sockets nur rohe Bytes senden; Sie haben keine Vorstellung von einer "Botschaft" auf dieser Abstraktionsebene. Wenn Sie also X-Bytes und weitere X-Bytes senden, dann X-Bytes lesen und weitere X-Bytes lesen, verhält sich Ihr System so, als ob es zwei Nachrichten gäbe, denn so haben Sie die Bytes aufgeteilt.

Wenn Sie X Bytes und weitere X Bytes senden, dann lesen Sie eine Antwort der Länge 2X, dann können Sie können eine einzelne kombinierte "Nachricht" lesen, aber wie Sie bemerkt haben, die zugrundeliegende Implementierung der Streams kann wählen, wann Teile von Bytes zu liefern sind, so dass es X Bytes, dann X Bytes, später oder 2X auf einmal, oder 0.5X viermal zurückgeben kann.

    
DNA 03.10.2012, 19:49
quelle
4

InputStream und OutputStream sind zwei völlig getrennte Streams. Was Sie in einen schreiben, hat keine a priori Beziehung zu dem, was Sie von dem anderen lesen. Der InputStream gibt Ihnen alle Daten, die der Server an Sie sendet. Ich möchte auch diesen Teil Ihres Codes kommentieren:

%Vor%

Sie verwenden die Länge einer Zeichenkette test (nicht in Ihrem Code gezeigt), die nichts mit dem Byte-Array zu tun hat, das Sie als erstes Argument übergeben. Dies kann eine ArrayIndexOutOfBoundsException oder Kürzung der beabsichtigten Nachricht verursachen.

Zusätzliche Kommentare zu Ihrer aktualisierten Frage

Wenn Sie Ihren serverseitigen Code überprüfen, wird er nicht korrekt geschrieben. Sie müssen try { handleConnection(...); } finally { socket.close(); } haben, um eine ordnungsgemäße Bereinigung nach einem Fehler sowie bei normalem Abschluss sicherzustellen. Ihr Code schließt niemals etwas auf der Serverseite.

Schließlich und am kritischsten ist Ihr gesamter Code so geschrieben, dass ein Deadlock entstehen kann. Normalerweise benötigen Sie einen separaten Thread zum Lesen und Schreiben; Andernfalls kann Folgendes passieren:

  1. Sie versuchen, einige Daten in die Ausgabe zu schreiben;
  2. Der Server liest es und versucht, mit Daten in Ihrer Eingabe zu antworten;
  3. Aber da die Puffer zu klein sind, schaffst du es nicht, alles zu senden, weil der Server dir zuerst etwas senden will und dann den Rest erhält; aber du kommst nicht zum empfangenden Teil, bevor du alles geschickt hast, was du hast.
Marko Topolnik 03.10.2012 19:25
quelle