1. Zwei Hauptprobleme bei der Netzwerkprogrammierung
Einer ist, wie man einen oder mehrere Hosts im Netzwerk genau lokalisiert, und der andere ist, wie nach dem Auffinden des Hosts Daten zuverlässig und effizient übertragen werden können.
Im TCP/IP -Protokoll ist die IP -Schicht hauptsächlich für den Standort des Netzwerkhosts und das Routing der Datenübertragung verantwortlich. Die IP -Adresse kann einen Host im Internet eindeutig bestimmen.
Die TCP-Schicht bietet einen zuverlässigen (TCP) oder nicht zuverlässigen Datenübertragungsmechanismus (UDP) für die Anwendung, das das Hauptziel der Netzwerkprogrammierung darstellt, und muss sich im Allgemeinen nicht darum kümmern, wie die IP-Schicht Daten verarbeitet.
Das beliebteste Netzwerkprogrammiermodell ist derzeit die Client/Server -Struktur (C/S). Das heißt, eine der Kommunikationsparteien fungiert als Server, um darauf zu warten, dass der Kunde eine Anfrage einreicht und antwortet. Der Kunde gilt für den Server, wenn der Dienst benötigt wird. Der Server läuft im Allgemeinen immer als Daemon und hört den Netzwerkport an. Sobald ein Kunde dies anfordert, startet er einen Serviceprozess, um auf den Kunden zu reagieren und gleichzeitig den Service -Port selbst zu hören, damit spätere Kunden auch rechtzeitig Service erhalten können.
2. Zwei Arten von Übertragungsprotokollen: TCP; UDP
TCP ist die Abkürzung des Tranfer Control Protocol , eines verbindungsorientierten Protokolls, das eine zuverlässige Übertragung gewährleistet. Die Übertragung über das TCP-Protokoll führt zu einer Reihenfolge fehlerfreier Datenströme. Es muss eine Verbindung zwischen den beiden Steckdosenpaaren des Absenders und dem Empfänger hergestellt werden, um auf der Grundlage des TCP -Protokolls zu kommunizieren. Wenn ein Socket (normalerweise ein Server -Socket) darauf wartet, eine Verbindung herzustellen, kann die andere Steckdose eine Verbindung erfordern. Sobald diese beiden Steckdosen verbunden sind, können sie eine Zwei-Wege-Datenübertragung durchführen, und beide Parteien können Sende- oder Empfangsvorgänge durchführen.
UDP ist die Abkürzung des User Datagram Protocol . Es ist ein verbindungsloses Protokoll. Jedes Datagramm ist eine unabhängige Information, einschließlich einer vollständigen Quell- oder Zieladresse. Es wird durch einen möglichen Pfad an das Ziel im Netzwerk übertragen. Unabhängig davon, ob es das Ziel erreichen kann, die Zeit für das Ziel des Ziels und die Richtigkeit des Inhalts nicht garantiert werden kann.
Vergleichen:
UDP:
TCP:
Anwendung:
3. Socket-basierte Java-Netzwerkprogrammierung
1. Was ist Steckdose
Zwei Programme im Netzwerk realisieren den Datenaustausch über eine wechselseitige Kommunikationsverbindung. Ein Ende dieses Zwei-Wege-Links wird als Sockel bezeichnet. Socket wird normalerweise verwendet, um sich zwischen Kunden und Dienstleistungsanbietern zu verbinden. Socket ist eine sehr beliebte Programmierschnittstelle des TCP/IP -Protokolls. Eine Steckdose wird durch eine IP -Adresse und eine Portnummer eindeutig bestimmt.
Die von Socket unterstützten Protokolle sind jedoch nicht nur TCP/IP, sodass zwischen den beiden keine erforderliche Verbindung besteht. In der Java -Umgebung bezieht sich die Socket -Programmierung hauptsächlich auf Netzwerkprogramme basierend auf dem TCP/IP -Protokoll.
2. Der Prozess der Sockelkommunikation
Das Server -Seite listen (hört), ob eine Verbindungsanforderung in einem bestimmten Port vorhanden ist. Die Client -Seite stellt eine Connect -Anforderung an die Serverseite aus, und die Serverseite sendet eine Akzeptanznachricht an die Client -Seite zurück. Eine Verbindung wird hergestellt. Sowohl die Server als auch die Client -Seite können durch Senden, Schreiben und andere Methoden miteinander kommunizieren.
Für einen voll funktionsfähigen Socket muss die folgende Grundstruktur enthalten sein, und der Arbeitsprozess umfasst die folgenden vier grundlegenden Schritte:
(1) Sockel erstellen;
(2) Öffnen Sie den mit der Sockel angeschlossenen Eingang/Abfluss;
(3) den Socket nach einem bestimmten Protokoll lesen/schreiben;
(4) Schließen Sie die Steckdose. (In den tatsächlichen Anwendungen wird die angezeigte Schließung nicht verwendet. Obwohl viele Artikel dies empfehlen, hat es in meinem Programm möglicherweise keine Auswirkungen, da das Programm selbst relativ einfach ist und niedrige Anforderungen hat.)
3. Erstellen Sie Socket
Socket (Inetaddress -Adresse, int Port); Socket (Inetaddress -Adresse, int Port, Boolean Stream); Socket (String Host, int Prot); Socket (String -Host, int -Protokoll, Boolean Stream); Socket (SocketImpl Impl) Socket (String Host, int Port, Inetaddress localAddr, int localport) Socket (Inetaddress -Adresse, Int -Port, Inetaddress localAddr, int localport) ServerSocket (int Port); ServerSocket (int Port, int Backlog); ServerSocket (int Port, Int Backlog, Inetaddress Bindaddr) wobei Adresse, Host und Port die IP -Adresse, den Hostnamen und die Portnummer der anderen Partei in der bidirektionalen Verbindung sind. Der Stream gibt an, ob es sich bei der Socket um einen Stream -Socket oder ein Datagramm -Sockel handelt. LocalPort gibt an, dass die Portnummer des lokalen Hosts, LocalAddr und Bindaddr die Adresse des lokalen Computers (die Hostadresse des ServersSocket) sind. Impl ist die übergeordnete Klasse des Sockets, mit der Serversocket und Sockets erstellt werden können. Die Anzahl stellt die maximale Anzahl von Verbindungen dar, die der Server unterstützen kann. Zum Beispiel: Lernen von Video -Netzwerk http://www.xxspw.com Socket Client = New Socket ("127.0.01", 80); ServerSocket Server = New ServerSocket (80);Beachten Sie, dass Sie bei der Auswahl eines Ports vorsichtig sein müssen. Jeder Port bietet einen bestimmten Service. Nur durch Angeben des richtigen Ports kann der entsprechende Dienst erhalten werden. Die Portnummern von 0 ~ 1023 sind vom System reserviert. Beispielsweise beträgt die Portnummer des HTTP -Dienstes 80, die Portnummer des Telnet -Dienstes 21 und die Portnummer des FTP -Dienstes 23. Wenn wir die Portnummer auswählen, wählen Sie daher am besten eine Nummer mehr als 1023, um Konflikte zu verhindern.
Wenn beim Erstellen einer Socket ein Fehler auftritt, wird eine IOException generiert und muss im Programm verarbeitet werden. Wenn Sie also Socket oder Serversocket erstellen, müssen Ausnahmen gefangen oder geworfen werden.
4. Einfaches Client/Server -Programm
1. Kundenprogramm
import Java.io.*; Java.net importieren.*; public class talkclient {public static void main (String args []) {try {Socket Socket = New Socket ("127.0.1", 4700); // eine Client -Anfrage an den 4700 -Port des MaschinenbuferedReaders sin = neuer BufferedReader (New InputStreamReader (System.in)) senden; // Konstruieren Sie das BufferedReader -Objekt aus dem System Standard -Eingangsgerät Pressreiber os = neuer Pressewriter (Socket.getOutputStream ()); // den Ausgangsstrom aus dem Socket -Objekt abrufen und konstruieren Sie das Printwriter -Objekt BufferedReader IS = New BufferedReader (neuer InputStreamReader (Socket.getInputStream ())); // den Eingabestream aus dem Socket -Objekt abrufen und die entsprechende BufferedReader -Objekt -String -Readline konstruieren. Readline = sin.readline (); // Lesen Sie eine Zeichenfolge aus der Systemstandardeingabe (! Readline.equals ("Bye") {// Wenn die aus der Standardeingabe gelesene Zeichenfolge "Bye" lautet, stoppen Sie das Schleifen os.println (readline); // Die Zeichenfolge, die aus der Systemstandard -Eingabe von System Standard in Server OS.Flush () gelesen wurde, ausgeben. // den Ausgabestream so aktualisieren, dass der Server sofort das String System.out.println ("Client:"+Readline) empfängt; // Drucken Sie das Lesestring system.out.println ("Server:"+is.readline ()); // Lesen Sie eine Zeichenfolge vom Server aus und drucken Sie ihn auf die Standardausgabe readline = sin.readline (); // Lesen Sie eine Zeichenfolge aus der System Standardeingabe} // Weiter mit os.close (); // Socket -Ausgangsstream schließen ist.CLOSE (); // Socket Socket Socket schließen .CLOSE (); // Socket schließen} catch (Ausnahme e) {System.out.println ("Fehler"+e); // Ein Fehler tritt auf, eine Fehlermeldung wird gedruckt}}}2. serverseitiges Programm
import Java.io.*; Java.net importieren.*; Java.Applet.applet importieren; öffentliche Klasse TalkServer {public static void main (String args []) {try {serversocket server = null; try {server = new ServerSocket (4700); // Erstellen Sie ein Serversocket, um Kundenanfragen auf Port 4700 zuzuhören // Fehler, Druckfehlermeldung} Socket Socket = NULL; try {socket = server.accept (); // Akzeptieren () verwenden, um die Client -Anfrage zu blockieren und zu warten. Wenn ein Client // nach der Anforderung ein Socket -Objekt generiert wird, und weiterhin} catch (Ausnahme E) {System.out.println ("Fehler."+E) ausführen; // Ein Fehler tritt auf, Druckfehlerinformationen werden gedruckt} String -Zeile; BufferedReader ist = neuer BufferedReader (neuer InputStreamReader (Socket.getInputStream ())); // den Eingabestream aus dem Socket -Objekt abrufen und den entsprechenden BufferedReader -Objekt -Pressewriter os = newPrintwriter (socket.getOutputStream ()) konstruieren; // den Ausgangsstrom aus dem Socket -Objekt abrufen und das Printwriter -Objekt BufferedReader sin = neuer BufferedReader (New InputStreamReader (System.in)) konstruieren; // Konstruieren Sie das BufferedReader -Objekt system.out.println ("client:"+is.readline ()); // Drucken Sie die Zeichenfolge, die vom Client in der Standardausgabestandlinie gelesen wird. // Lesen Sie eine Zeichenfolge aus der Standardeingabe, while (! Line // Die String os.flush () an den Client ausgeben; // den Ausgabestream so aktualisieren, dass der Client sofort das String System.out.println ("Server:"+Zeile) empfängt; // Drucken Sie das Lesestring system.out.println ("client:"+is.readline ()); // Lesen Sie eine Zeichenfolge vom Client aus und drucken Sie sie in die Standardausgabestlinie = sin.readline (); // Lesen Sie eine Zeichenfolge aus der System Standardeingabe} // Weiter mit os.close (); // Socket -Ausgangsstream schließen ist.CLOSE (); // Socket Socket Socket schließen .CLOSE (); // Socket Server schließen.CLOSE (); // ServerSocket} catch (Ausnahme e) {System.out.println ("Fehler:"+e); // Es ist ein Fehler aufgetreten, Druckfehlermeldung}}}5. Support Multi-Client/Server-Programm unterstützen
Das vorherige Client/Server -Programm kann nur Gespräche zwischen Server und einem Kunden implementieren. In den tatsächlichen Anwendungen wird häufig ein dauerhaftes Programm auf dem Server ausgeführt, das Anfragen von mehreren anderen Clients empfangen und entsprechende Dienste anbietet. Um die Funktion der Bereitstellung von Diensten für mehrere Kunden auf dem Server zu erkennen, muss das obige Programm transformiert und der Multi-Threading-Mechanismus implementiert werden. Der Server hört immer darauf zu, ob Client -Anfragen auf dem angegebenen Port vorhanden sind. Sobald die Client -Anfrage gehört wurde, startet der Server einen speziellen Service -Thread, um auf die Anfrage des Clients zu antworten. Der Server selbst tritt sofort in den Hörstatus ein, nachdem der Thread gestartet wurde und darauf wartet, dass der nächste Client ankommt.