Netzwerkanwendungen sind in zwei Teile unterteilt: Client und Server, und die Socket -Klasse ist eine Java -Klasse, die für die Behandlung von Client -Kommunikation verantwortlich ist. Über diese Klasse können Sie mit einem bestimmten IP- oder Domänennamen eine Verbindung zu einem Server herstellen und Daten mit dem Server miteinander senden und empfangen. Die Verwendung der Socket -Klasse wird in diesem Artikel und in einigen Artikeln später ausführlich erörtert, einschließlich der Grundlagen der Socket -Klasse, verschiedenen Verbindungsmethoden, Get- und Festlegen von Methoden, Zeitüberschreitungen während der Verbindung und Schließung von Netzwerkverbindungen usw.
In diesem Artikel werden wir die grundlegenden Schritte und Methoden der Verwendung der Socket -Klasse diskutieren. Im Allgemeinen müssen Netzwerk -Client -Programme die folgenden drei Schritte ausführen, wenn sie eine Verbindung zu Serviceprogrammen herstellen.
1. Verbindung zum Server eine Verbindung herstellen
Der Client kann auf zwei Arten eine Verbindung zum Server herstellen, eine soll über IP eine Verbindung zum Server herstellen, und der andere besteht darin, über den Domänennamen eine Verbindung zum Server herzustellen.
Tatsächlich sind diese beiden Methoden im Wesentlichen in einem Weg. Im zugrunde liegenden Client verbinden sie alle über IP zum Server, es gibt jedoch bestimmte Unterschiede zwischen den beiden Methoden. Wenn das Serverprogramm über IP angeschlossen ist, stellt der Client nur einfach eine Verbindung zu IP her. Wenn der Server über den Domänennamen verbunden ist, muss der Client den Domänennamen über DNS in IP auflösen und dann gemäß dieser IP eine Verbindung herstellen.
In vielen Programmiersprachen oder Entwicklungstools (z. B. C/C ++, Delphi), wenn Sie mithilfe des Domänennamens mit dem Server eine Verbindung zum Server herstellen, müssen Sie zuerst den Domänennamen mit IP auflösen und dann über IP eine Verbindung herstellen. In Java wurde die Funktion der Domain -Namensauflösung in die Socket -Klasse aufgenommen. Daher müssen wir nur den Domänennamen wie die Verwendung von IP verwenden.
Die häufigste Methode zur Verbindung zu Serverprogrammen über die Socket -Klasse besteht darin, den IP- oder Domänennamen und die Portnummer als Parameter über den Socket -Klasse -Konstruktor an die Socket -Klasse zu übergeben. Es gibt viele überlastete Formen des Konstruktors der Socket -Klasse. In diesem Abschnitt wird nur eines der am häufigsten verwendeten Formulare erörtert: öffentlicher Socket (String -Host, int Port). Aus der Definition dieses Konstruktors müssen Sie nur die IP- oder Domänenname und die Portnummer direkt an den Konstruktor übergeben. Der folgende Code ist ein Beispielprogramm, das eine Verbindung zu Serverprogrammen herstellt:
Paket MySocket; Java.net importieren.*; öffentliche Klasse MyConnection {public static void main (String [] args) {try {if (args.Length> 0) {Socket Socket = New Socket (args [0], 80); System.out.println (args [0] + "erfolgreich verbunden!"); } else system.out.println ("Bitte geben Sie den IP- oder Domänennamen an!"); } catch (Ausnahme e) {System.err.println ("Fehlermeldung:" + e.getMessage ()); }}} Im obigen IP- oder Domänennamen wird über den Befehlszeilenparameter in das Programm übergeben, und dann wird der 80 -Port des IP- oder Domänennamens, der über den Befehlszeilenparameter angegeben ist, über den Socket -Socket = New Socket (Args [0], 80). Da der Konstruktor der Socket -Klasse beim Definieren von Würfeln verwendet wird, müssen Sie beim Aufrufen des Socket -Klassenkonstruktors die Anweisung Versuch verwenden, den Fehler zu fangen, oder die Anweisung Throws verwenden, um den Fehler für die Hauptfunktion zu werfen.
Verwenden Sie die Socket -Klasse, um eine Verbindung zum Server herzustellen, um zu bestimmen, welche Ports auf einem Host geöffnet sind. Der folgende Code ist ein Programm, mit dem in dieser Maschine Ports geöffnet werden.
2. Senden und empfangen Sie Daten
Die beiden wichtigsten Methoden in der Socket -Klasse sind GetInputStream und GetoutputStream. Diese beiden Methoden werden verwendet, um InputStream- und OutputStream -Objekte zum Lesen und Schreiben von Daten zu erhalten. Der InputStream liest hier die vom Serverprogramm an den Client gesendeten Daten, und der OutputStream sind die Daten, die der Client an das Serverprogramm senden möchte.
Wenn Sie tatsächliche Netzwerk -Client -Programme schreiben, wird von GetInputStream oder GetOutputStream und WHO zuerst verwendet und die später verwendet werden und die später verwenden, um die spezifische Anwendung zu verwenden. Wenn Sie beispielsweise eine Verbindung zum 80 -Port (in der Regel der Standardport des HTTP -Protokolls des HTTP -Protokolls) der Post- und Telekommunikations -Press -Website (www.ptpress.com.cn) herstellen, eine Zeichenfolge senden und schließlich die von www.ptpress.com.cn zurückgegebenen Informationen lesen.
Paket mySocket; import Java.net.*; import Java.io.*; öffentliche Klasse MyConnection2 {public static void main (String [] args) löst Ausnahme aus {Socket Socket = New Socket ("www.ptpress.com.cn", 80); // Daten an das Serverprogramm ausgeben Stream ops = socket.getOutputStream (); OutputStreamwriter opsw = neuer outputStreamWriter (OPS); BufferedWriter BW = New BufferedWriter (OPSW); bw.write ("Hallo Welt/r/n/r/n"); bw.flush (); // Daten aus dem Serverprogramm inputStream ips = socket.getInputStream () empfangen; InputStreamReader ipsr = new InputStreamReader (IPS); BufferedReader BR = New BufferedReader (IPSR); String S = ""; while (s = br.readline ())! = null) system.out.println (s); socket.close (); }} Beim Schreiben des obigen Code sollten Sie die folgenden zwei Punkte beachten:
1. Um die Effizienz der Datenübertragung zu verbessern, überträgt die Socket -Klasse nicht jedes Mal, wenn die Schreibmethode aufgerufen wird, sondern schreibt die Daten, die in einen Puffer übertragen werden sollen (die Standardeinstellung beträgt 8192 Bytes) und sendet die Daten dann in diesem Puffer über die Flush -Methode zusammen. Daher bw.flush (); ist notwendig.
2. Der Grund, warum "/r/n/r/n" nach Hello World beim Senden einer Zeichenfolge hinzugefügt wird, liegt darin, dass der HTTP -Protokollheader "/r/n/r/n" als Endflag verwendet (der detaillierte Inhalt des HTTP -Protokolls wird später erläutert). Durch das Hinzufügen von "/r/n/r/n" nach dem Senden einer Zeichenfolge kann das Serverprogramm der Meinung sein, dass der HTTP -Header beendet ist und verarbeitet werden kann. Wenn "/r/n/r/n" nicht hinzugefügt wird, wartet das Serverprogramm auf das Ende des HTTP -Headers, dh "/r/n/r/n". In diesem Fall sendet das Serverprogramm keine Antwortinformationen an den Client, und Br.Readline () wird blockiert, da es nicht gelesen werden kann, um Informationen zu antworten, bis die Verbindung abgelaufen ist.
3. Schalten Sie die Netzwerkverbindung aus
Bisher haben wir ein vorläufiges Verständnis der grundlegenden Verwendungsmethoden der Socket -Klasse, aber nachdem die Socket -Klasse die Daten verarbeitet hat, besteht die angemessenste Methode für das Ende darin, die enge Methode der Socket -Klasse zu verwenden, um die Netzwerkverbindung zu schließen. Obwohl die enge Methode darin verwendet wurde, ist die Methode zum Schließen der Netzwerkverbindung nicht nur die enge Methode. Lassen Sie uns unter welchen Umständen die Netzwerkverbindung schalten.
Es gibt vier Situationen, in denen Netzwerkverbindungen geschlossen werden können:
Obwohl all diese 4 Methoden dasselbe Ziel erreichen können, verwenden Sie die erste oder zweite Methode am besten, um die Netzwerkverbindung zu schließen. Dies liegt daran, dass die dritte und vierte Methoden die Netzwerkverbindung im Allgemeinen nicht sofort schließen. In diesem Fall bleibt für einige Anwendungen eine große Anzahl nutzloser Netzwerkverbindungen übrig, die eine große Menge an Systemressourcen belegen.
Nachdem das Socket -Objekt geschlossen wurde, können wir die iscluste Methode verwenden, um festzustellen, ob sich ein Socket -Objekt in einem geschlossenen Zustand befindet. Was jedoch durch die Verwendung der iscloseded -Methode zurückgegeben wird, ist der aktuelle Zustand des Socket -Objekts. Das heißt, unabhängig davon, ob das Socket -Objekt erfolgreich angeschlossen wurde, kehrt Isclosde wahr, solange es im geschlossenen Zustand ist. Wenn Sie nur ein nicht miteinander verbundenes Socket -Objekt erstellen, gibt ISCLOSE auch True zurück. Wie im folgenden Code gezeigt, wird FALSE ausgegeben.
Socket Socket = New Socket (); System.out.println (Socket.ISclosed ());
Zusätzlich zur ISCLOSE -Methode verfügt die Socket -Klasse über eine ISConnected -Methode, um festzustellen, ob das Socket -Objekt erfolgreich angeschlossen ist. Wenn Sie diesen Namen sehen, können die Leser ihn falsch verstehen. Tatsächlich bestimmt die ISConnected -Methode nicht den aktuellen Verbindungsstatus des Socket -Objekts, sondern ob das Socket -Objekt erfolgreich angeschlossen wurde. Wenn es erfolgreich miteinander verbunden wurde, kehrt ISCLOSE jetzt immer noch wahr, wenn ISCLOSE TRUE TRUE zurückgibt. Um festzustellen, ob sich das aktuelle Socket -Objekt in einem verbundenen Zustand befindet, müssen gleichzeitig die Methoden isclose und isconnected verwendet werden, dh das Socket -Objekt befindet sich nur in einem verbundenen Zustand, wenn ISCLOSE false und isconnected Returns true. Der folgende Code demonstriert den Erzeugungsprozess verschiedener Zustände des obigen Socket -Objekts.
Paket mySocket; import Java.net.*; öffentliche Klasse MycleSeconnection {public static void printstate (Socket Socket, String -Name) {System.out.println (Name + ".isclosed ():" + socket.isclosed ()); System.out.println (Name + ".isconnected ():" + socket.isconnected ()); if (socket.isclosed () == false && socket.isconnected () == true) system.out.println (Name + "im verbundenen Zustand!"); sonst system.out.println (Name + "in nicht verbundenem Zustand!"); System.out.println (); } public static void main (String [] args) löst eine Ausnahme aus {Socket Socket1 = null, socket2 = null; Socket1 = neuer Socket ("www.ptpress.com.cn", 80); printState (Socket1, "Socket1"); Socket1.getOutputStream (). Close (); printState (Socket1, "Socket1"); Socket2 = neuer Socket (); printstate (socket2, "socket2"); Socket2.CLOSE (); printstate (socket2, "socket2"); }} Nach dem Ausführen des oben genannten Code wird die folgende Ausgabe angezeigt:
Socket1.isclosed (): Falsch
socket1.isconnected (): true
Socket1 ist in einem verbundenen Zustand!
Socket1.isclosed (): true
socket1.isconnected (): true
Socket1 befindet sich in einem nicht vernetzten Zustand!
socket2.isclosed (): false
socket2.isconnected (): false
Socket2 befindet sich in einem nicht vernetzten Zustand!
socket2.isclosed (): true
socket2.isconnected (): false
Socket2 befindet sich in einem nicht vernetzten Zustand!
Aus den Ausgangsergebnissen ist ersichtlich, dass Socket1 nach dem Abschluss der Ausgangsstream von Socket1 automatisch geschlossen wird. Im obigen Code können wir sehen, dass für einen Socket -Objekt -Socket2, der nicht mit dem Server verbunden ist, die iscluste Methode falsch ist. Wenn die Methode von Socket2 true zurückgibt, muss die Schließmethode mit Socket2.Close angezeigt werden.
Obwohl wir die meiste Zeit die Socket -Klasse oder die Schließmethode des Eingangs- und Ausgangsstroms verwenden können, um die Netzwerkverbindung zu schließen, möchten wir manchmal nur den OutputStream oder den InputStream schließen. Wenn wir den Eingangs- und Ausgangsstrom schließen, schließen wir die Netzwerkverbindung nicht. Dies erfordert die Verwendung von zwei anderen Methoden der Socket -Klasse: Herunterfahren und Herunterfahren. Diese beiden Methoden schließen nur die entsprechenden Eingangs- und Ausgangsströme, aber sie haben nicht die Funktion, die Netzwerkverbindung gleichzeitig zu schließen. Wie bei den iSclosieren und isconnected -Methoden stellt die Socket -Klasse auch zwei Methoden zur Verfügung, um festzustellen, ob die Eingangs- und Ausgangsströme des Socket -Objekts geschlossen sind. Diese beiden Methoden sind IsInputShutdown () und IsoutputShutdown (). Der folgende Code zeigt den Prozess des Schließens nur Eingangs- und Ausgabestreams:
Paket mySocket; import Java.net.*; öffentliche Klasse MycleSeconnection1 {public static void printstate (Socket Socket) {System.out.println ("iSInputShutdown:" + socket.issinputShutdown ()); System.out.println ("isoutputShutdown:" + socket.isoutputShutdown ()); System.out.println ("isclosed:" + socket.isclosed ()); System.out.println (); } public static void main (String [] args) löst Ausnahme aus {Socket Socket = New Socket ("www.ptpress.com.cn", 80); Printstate (Socket); Socket.ShutDownInput (); Printstate (Socket); Socket.ShutDownoutput (); Printstate (Socket); }} Nach dem Ausführen der obigen Generation erhalten Sie die folgende Ausgabe:
IsInputShutdown: Falsch
IsoutputShutdown: Falsch
isclosed: falsch
IsInputShutdown: True
IsoutputShutdown: Falsch
isclosed: falsch
IsInputShutdown: True
IsoutputShutdown: True
isclosed: falsch
Aus den Ausgabergebnissen können wir feststellen, dass die iscloseded -Methode immer False zurückgibt. Daher ist es sicher, dass das StilldownInput und das Herunterfahren nicht den Status des Socket -Objekts beeinflussen.
Ich hoffe, dieser Artikel wird Ihnen hilfreich sein. Dies ist alles, was Java verwendet, um Dateninhalte zu empfangen und zu senden. Ich hoffe, dass alle weiterhin unserer Website folgen werden! Wenn Sie Java lernen möchten, können Sie diese Website weiter verfolgen.