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:
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.
Wenn ich in die Buchse A1, A2, ... geschrieben habe, bekomme ich A1, A2, ... eine Zeichenfolge, oder?
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.
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.
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:
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.
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:
Tags und Links java sockets inputstream outputstream