Socket, auch als Sockets bekannt, ist eine der grundlegenden Technologien für die Kommunikation mit Computernetzwerk. Heutzutage werden die meisten webbasierten Software wie Browser, Instant Messaging-Tools und sogar P2P-Downloads basierend auf Socket implementiert. In diesem Artikel werden Socket -Programmierung basierend auf TCP/IP und zum Schreiben eines Client/Server -Programms vorgestellt.
Dessert vor dem Abendessen
Das UNIX-Eingangs- und Ausgangssystem (IO) folgt den Betriebsvorlagen wie offenem Lesebuch-Schreiben. Bevor ein Benutzerprozess IO -Vorgänge ausführt, muss er aufgerufen werden, um Berechtigungen für das Lesen oder Schreiben zu erhalten und zu erhalten, damit die Datei oder das Gerät betrieben werden sollen. Sobald das IO -Betriebsobjekt geöffnet ist, kann der Benutzerprozess einen oder mehrere Lese- oder Schreibvorgänge auf dem Objekt ausführen. Lesenbetrieb wird verwendet, um Daten aus IO -Betriebsobjekten zu lesen und die Daten an den Benutzerprozess zu übergeben. Der Schreibvorgang wird verwendet, um Daten in Benutzerprozessen an IO -Betriebsobjekte zu übergeben. Nach Abschluss aller gelesenen und Schreibvorgänge muss der Benutzerprozess kurz vor dem System aufrufen, um das System zu benachrichtigen, das die Verwendung des IO -Objekts abschließt.
Als Unix begann, Interprocess Communication (IPC) zu unterstützen, wurde die IPC -Schnittstelle so konzipiert, dass sie der Datei -IO -Operation -Schnittstelle ähnelt. In Unix wird ein Prozess eine Reihe von IO -Deskriptoren haben, die gelesen und geschrieben werden können. Der IO -Deskriptor kann eine Datei, ein Gerät oder ein Kommunikationskanal (Socket Socket) sein. Ein Dateideskriptor besteht aus drei Teilen: Erstellen (Öffnen von Socket), Lesen und Schreiben von Daten (Akzeptieren und Senden an Socket) und Zerstörung (Schließung der Steckdose).
In UNIX-Systemen wird die BSD-ähnliche Version der IPC-Schnittstelle als Ebene über den TCP- und UDP-Protokollen implementiert. Das Ziel der Nachricht wird durch die Socket -Adresse dargestellt. Eine Socket -Adresse ist eine Kommunikationsbescheid, die aus einer Netzwerkadresse und einer Portnummer besteht.
Kommunikationsoperationen mit Inter-Process erfordern ein Paar Steckdosen. Die Kommunikation mit der Inter-Prozess wird durch die Datenübertragung zwischen einer Socket in einem Prozess und einer anderen Sockel in einem anderen Prozess erreicht. Wenn eine Nachricht ausgeführt und gesendet wird, wird die Nachricht in der Socket am Sendenende in die Warteschlange gestellt, bis das Netzwerkprotokoll auf unterer Ebene die Nachrichten versendet. Wenn die Nachricht den Socket am empfangenden Ende erreicht, befindet sie sich auch in einer Warteschlange, bis der Vorgang am empfangenden Ende die Nachricht empfängt.
TCP- und UDP -Kommunikation
In Bezug auf die Socket -Programmierung haben wir zwei Kommunikationsprotokolle zur Auswahl. Einer ist Datagrammkommunikation, der andere ist Stream Communication.
Datagrammkommunikation
Das Datagram -Kommunikationsprotokoll ist das, was wir häufig UDP (Benutzerdatenprotokoll) nennen. UDP ist ein verbindungsloses Protokoll, was bedeutet, dass wir jedes Mal, wenn wir Datagramme senden, den Socket -Deskriptor der nativen Maschine und den Socket -Deskriptor des Empfängers gleichzeitig senden müssen. Daher müssen wir jedes Mal zusätzliche Daten senden, wenn wir kommunizieren.
Stream -Kommunikation
Das Stream -Kommunikationsprotokoll, auch als TCP (Transfer -Control -Protokoll) bekannt, wird auch als TCP (Transfer Control Protocol) bezeichnet. Im Gegensatz zu UDP ist TCP ein verbindungsbasiertes Protokoll. Vor der Verwendung der Stream -Kommunikation müssen wir eine Verbindung zwischen dem Kommunikationspaar von Steckdosen herstellen. Einer der Steckdosen dient als Server, um Verbindungsanfragen zu hören. Der andere stellt Verbindungsanfragen als Kunde durch. Sobald die beiden Steckdosen eine Verbindung hergestellt haben, können sie Daten in Einweg oder zweiwegs übertragen.
Nachdem wir dies gelesen haben, haben wir einige Fragen, ob wir UDP oder TCP für die Socket -Programmierung verwenden. Die Auswahl der Socket-Programmierung basierend auf welchem Protokoll basiert auf Ihrem spezifischen Anwendungsszenario von Ihrem spezifischen Client-Server-Programm. Im Folgenden analysieren wir kurz den Unterschied zwischen TCP- und UDP -Protokollen, was Ihnen helfen kann, besser auszuwählen, welche Sie verwenden sollen.
In UDP muss jedes Mal, wenn ein Datagramm gesendet wird, der Socket -Deskriptor der nativen Maschine und der Socket -Deskriptor des Empfängers einbezogen werden. Da es sich bei TCP um ein verbindungsbasiertes Protokoll handelt, muss eine Verbindung zwischen Kommunikationssocketpaaren vor der Kommunikation hergestellt werden, sodass im TCP-Protokoll eine zeitaufwändige Verbindungsprogrammierung vorliegt.
In UDP haben Datagram -Daten eine Größe von 64 KB. Es gibt keine solche Einschränkung in TCP. Sobald das Socket -Paar von TCP -Kommunikation eine Verbindung hergestellt hat, ähnelt die Kommunikation zwischen ihnen einem IO -Stream, und alle Daten werden in der Reihenfolge gelesen, die sie akzeptiert.
UDP ist ein unzuverlässiges Protokoll, und die gesendeten Datagramme werden nicht unbedingt von der Empfangssocket in der Reihenfolge akzeptiert, in der sie gesendet werden. Dann ist TCP ein zuverlässiges Protokoll. Die Reihenfolge der vom Empfangsende erhaltenen Pakete steht im Einklang mit der Reihenfolge der Pakete am Sendeende.
Kurz gesagt, TCP ist für Netzwerkdienste wie Remote -Login (Rlogin, Telnet) und Dateiübertragung (FTP) geeignet. Denn die Größe dieser Daten, die übertragen werden müssen, ist ungewiss. UDP ist einfacher und leichter als TCP. UDP wird verwendet, um einige Dienste zu implementieren, die mehr Echtzeit sind oder keine Paketverlust haben. Die Paketverlustrate von UDP in LAN ist relativ niedrig.
Sockelprogrammierung in Java
Im folgenden Abschnitt werde ich erläutern, wie man Socket verwendet, um Client- und Serverprogramme über einige Beispiele zu schreiben.
Hinweis: Im folgenden Beispiel verwende ich die Socket -Programmierung basierend auf dem TCP/IP -Protokoll, da dieses Protokoll viel häufiger verwendet wird als UDP/IP. Alle Sockelklassen befinden sich im Java.net-Paket. Daher müssen wir dieses Paket vorstellen, wenn wir Socket-Programmierung durchführen.
Kunden schreiben
Sockel einschalten
Wenn Sie auf der Client -Seite sind, müssen Sie den folgenden Code schreiben, um einen Socket zu öffnen.
String host = "127.0.0.1"; int port = 8919; Socket Client = New Socket (Host, Port);
Im obigen Code ist Host der Computer, mit dem der Client eine Verbindung herstellen muss, und Port ist der Port, der vom Server verwendet wird, um die Anforderung anzuhören. Bei der Auswahl eines Ports müssen Sie eine Sache achten, dass Ports wie 0 ~ 1023 vom System reserviert wurden. Diese Ports werden von einigen häufig verwendeten Diensten wie Mail, FTP und HTTP verwendet. Wenn Sie einen serverseitigen Code schreiben und einen Port auswählen, wählen Sie bitte einen Port über 1023 aus.
Daten schreiben
Als nächstes schreiben Sie die Anforderungsdaten. Wir erhalten das OutputStream -Objekt aus dem Socket -Objekt des Clients und schreiben dann die Daten. Sehr ähnlich dem Datei -IO -Verarbeitungscode.
öffentliche Klasse Clientsocket {public static void main (String args []) {String host = "127.0.0.1"; int port = 8919; try {Socket Client = New Socket (Host, Port); Writer writer = new outputStreamwriter (client.getOutputStream ()); writer.write ("Hallo vom Kunden"); writer.flush (); writer.close (); client.close (); } catch (ioException e) {e.printstacktrace (); }}}IO -Objekt schließen
Ähnlich wie bei der Datei IO müssen wir nach dem Lesen und Schreiben von Daten das IO -Objekt schließen, um die korrekte Freigabe von Ressourcen zu gewährleisten.
Serverseitiges Schreiben
Öffnen Sie den serverseitigen Socket
int port = 8919; ServerSocket Server = new ServerSocket (Port); Socket Socket = Server.Accept ();
Der obige Code erstellt einen serverseitigen Socket und ruft dann die Akzeptanzmethode auf, um den Anforderungsbuchse des Clients zu hören. Die Akzeptanzmethode ist eine Blockierungsmethode, die auf das Blockieren wartet, bis eine Verbindung zwischen dem Server und dem Client hergestellt wird.
Daten lesen
Rufen Sie das InputStream -Objekt über das oben erhaltene Socket -Objekt ab und installieren Sie die Datei -IO, um die Daten zu lesen. Hier drucken wir den Inhalt aus.
public class serverclient {public static void main (String [] args) {int port = 8919; try {serversocket server = new ServerSocket (Port); Socket Socket = server.accept (); Reader reader = new InputStreamReader (Socket.getInputStream ()); char chars [] = new char [1024]; Int len; StringBuilder Builder = new StringBuilder (); while ((len = reader.read (chars))! = -1) {builder.append (neue String (Zeichen, 0, len)); } System.out.println ("von Client message empfangen =:" + builder); reader.close (); socket.close (); server.close (); } catch (Ausnahme e) {e.printstacktrace (); }}}IO -Objekt schließen
Es kann nicht vergessen werden. Schließlich muss ich das IO -Objekt korrekt schließen, um die korrekte Ressourcenfreigabe zu gewährleisten.
Beachten Sie ein Beispiel
Hier fügen wir ein Beispiel hinzu, in dem Socket zum Implementieren eines Echo -Servers verwendet wird. Der Server übergibt die vom Client gesendeten Daten an den Client zurück. Der Code ist sehr einfach.
Java.io importieren.*; import Java.net. Stringlinie; DataNputStream ist; Druckstream -Betriebssystem; Socket Clientocket = null; // Versuchen Sie, einen Server -Socket auf Port 9999 zu öffnen // Beachten Sie, dass wir keinen Port weniger als 1023 auswählen können, wenn wir nicht privilegierte Benutzer (root) versuchen {echoServer = new serversSocket (9999); } catch (ioException e) {System.out.println (e); } // Erstellen Sie ein Socket -Objekt aus dem ServerSocket, um // Verbindungen zu hören und zu akzeptieren. // Eingabe- und Ausgabestreams öffnen und {Clientsocket = echoServer.accept (); is = new DataNputStream (Clientsocket.getInputStream ()); OS = New PrintStream (Clientsocket.getOutputStream ()); // Solange wir Daten empfangen, wiederholen Sie diese Daten an den Client. while (true) {line = is.readline (); os.println (Linie); }} catch (ioException e) {System.out.println (e); }}}Kompilieren Sie und führen Sie den obigen Code aus und stellen Sie die folgende Anfrage aus. Sie können den Inhalt der von der Client -Anforderung übertragenen Daten sehen.
15:00 $ curl http://127.0.0.1:9999/?111get/?
Zusammenfassen
Es ist sehr interessant, Kunden-Server-Programmierung durchzuführen, und die Socket-Programmierung in Java ist einfacher und schneller als andere Sprachen (wie C).
Das Java.net -Paket enthält viele leistungsstarke und flexible Klassen für Entwickler, um Netzwerke zu programmieren. Bei Programmiernetzwerken wird empfohlen, die API unterhalb dieses Pakets zu verwenden. Gleichzeitig enthält das Sun.* -Paket auch viele netzwerkprogrammierende Klassen, es wird jedoch nicht empfohlen, die API unter diesem Paket zu verwenden, da sich dieses Paket möglicherweise ändern kann. Darüber hinaus kann dieses Paket nicht auf allen Plattformen garantiert werden.
Das obige ist eine Zusammenstellung von Java -Socket -Informationen. Wir werden in Zukunft weiterhin relevantes Wissen hinzufügen. Vielen Dank für Ihre Unterstützung für diese Website!