1. Einführung in TCP/IP
Die TCP/IP -Protokollfamilie ist ein vom Internet verwendetes Protokoll und kann auch in unabhängigen privaten Netzwerken verwendet werden.
Die TCP/IP -Protokollfamilie umfasst IP -Protokoll, TCP -Protokoll und UDP -Protokoll.
Das IP-Protokoll verwendet IP-Adressen, um Pakete zu verteilen, aber es ist ein Best-Effort-Service, und die Pakete können verloren gehen, außerordentlich oder wiederholt werden. Die TCP- und UDP -Protokolle fügen dem IP -Protokoll Portnummern hinzu, wodurch eine transparente Verbindung zwischen den Anwendungen der beiden Hosts hergestellt wird.
Der Unterschied besteht darin, dass das TCP -Protokoll IP -Schichtfehler behebt, wodurch Verbindungen zwischen Hosts über Handshake -Nachrichten hergestellt werden.
Anschließend werden die Fehler in der Nachricht durch Hinzufügen einer Seriennummer zur Nachricht wiederhergestellt. UDP erweitert einfach das IP -Protokoll.
Ermöglichen Sie es, zwischen Anwendungen zu arbeiten, nicht zwischen Hosts.
In Bezug auf IP -Adressen kann ein Host mehrere Netzwerkschnittstellen haben und eine Schnittstelle kann mehrere Adressen haben.
Einige IP -Adressen haben spezielle Verwendungen:
A. Loopback -Adresse: 127.0.0.1 wird immer einer Loopback -Schnittstelle zugeordnet, die hauptsächlich zum Testen verwendet wird.
B. Privatadresse: Beginnend mit 10, 192.168, 172. (16-31), verwendet für private Netzwerke. Wenn ein NAT -Gerät eine Nachricht weiterleitet, ordnet es das private Adressportpaar der Nachricht in einer Schnittstelle in das öffentliche Adressportpaar in einer anderen Schnittstelle ab. Dadurch können eine kleine Gruppe von Hosts ein IP -Adresspaar freigeben.
C. Multicast -Adresse: Die erste Zahl liegt zwischen 224 und 239.
2. Grundlagen
1. Adresse erhalten
public static void main (string [] args) {try {enumeration <networkInterface> interfaces = networkinterface.getNetworkInterfaces (); while (interfaces.hasmoreElements ()) {NetworkInterface iface = interfaces.nextElement (); System.out.println ("Schnittstelle:" + iface.getName ()); Enumeration <InetAddress> adDrlist = iface.getInetadDresse (); if (! addrlist.hasmoreElements ()) system.out.println ("keine Adresse"); while (addrlist.hasmoreElements ()) {inetaddress address = addrlist.nextElement (); System.out.println ("Adresse:" + adress.gethostaddress ()); }}} catch (socketException e) {e.printstacktrace (); }}2. TCP -Instanzprogramm
Es ist zu beachten, dass zwar nur eine Write () -Methode zum Senden von Zeichenfolgen auf der Client -Seite verwendet wird, die Serverseite diese Informationen möglicherweise auch von mehreren Blöcken empfängt. Auch wenn die Feedback -Zeichenfolge bei Rückgabe des Servers in einem Block gespeichert ist, kann dies TCP sein
Das Protokoll ist in mehrere Teile unterteilt.
TcpechoclientTest.java
public static void main (String [] args) löst IOException {String server = args [0] aus; byte [] data = args [1] .GEBYTES (); int port = 7; Socket Socket = neuer Socket (Server, Port); System.out.println ("Angeschlossen mit Server ..."); InputStream in = socket.getInputStream (); OutputStream out = socket.getOutputStream (); out.write (Daten); int TotalByTesrcvd = 0; int bytesrcvd; while (TotalByTesrcvd <data.length) {if ((byteSrcvd = in.read (data, TotalByTesrcvd, Data.Length - TotalByTesrcvd)) == -1). TotalByTesrcvd += bytesrcvd; } System.out.println ("empfangen:" + neue String (Daten)); socket.close (); }TcpechoServertest.java
private statische endgültige int bufsize = 32; public static void main (String [] args) löst IOException {ServerSocket ServerSocket = New ServerSocket (7) aus; int recvmsgSize; byte [] recemeBuf = new Byte [bufsize]; while (true) {Socket Socket = ServerSocket.accept (); System.out.println ("Handling Client" + "From Remote" + Socket.getremotesocketaddress () + "at Local" + Socket.getLocalsocketadDress ()); InputStream in = socket.getInputStream (); OutputStream out = socket.getOutputStream (); while ((recvmsgSize = in.read (recesbuf))! } socket.close (); }}Beachten Sie, dass der neue Socket die Portnummer angibt, auf die der Remote -Server hört, ohne den lokalen Port anzugeben, sodass die Standardadresse und die verfügbare Portnummer verwendet werden. Auf meinem Computer -Client -Port ist 4593, an Port 7 des Servers verbunden.
3. UDP -Instanzprogramm
Warum UDP -Protokoll verwenden? Wenn die Anwendung nur eine geringe Datenmenge auszeigt, überträgt die Einrichtungsphase der TCP -Verbindung mindestens doppelt so hoch (und doppelt so hoch wie die Hin- und Rückflugzeit).
UdpechoclientTest.java
public static void main (String [] args) löst IOException {inetaddress serveraddress = inetaddress.getByName (args [0]) aus; byte [] byTestosend = args [1] .GetBytes (); Datagramsocket socket = new DatagramSocket (); Socket.Setsotimeout (3000); DataGrampacket SENDPACKET = NEW DataGrampacket (byTestosend, byTestosend.length, Serveraddress, 7); DataGrampacket recemepacket = new DataGrampacket (New Byte [byTestosend.length], byTestosend.length); // Pakete können verloren gehen, daher müssen wir weiter versuchen, int zu tries = 0; boolean empfangeneResponse = false; do {socket.send (sendpacket); try {socket.receive (recemepacket); if (! recemepacket.getAddress (). Equals (Serveraddress)) Wirf eine neue IOException ("Empfangen von unbekannten Quellen"); empfangeneResponse = true; } catch (ioException e) {tries ++; System.out.println ("Timeout, erneut versuchen"); }} while (! empfangeneResponse && Versuche <5); if (empfangeneResponse) system.out.println ("empfangen:" + neuer String (recemepacket.getData ())); else system.out.println ("no response"); socket.close (); } UdpechoServertest.java
private statische endgültige int echomax = 255; public static void main (String [] args) löst ioException {Datagramsocket -Socket = new Datagramsocket (7) aus; DataGrampacket packet = new Datagrampacket (neues Byte [Echomax], Echomax); while (true) {socket.receive (paket); System.out.println ("Handling Client at" + packet.getAddress ()); Socket.Send (Paket); paket.setLength (echomax); }}Wenn Sie dieses Beispiel mit der vorherigen TCP -Instanz vergleicht, gibt es die folgenden Unterschiede:
A.DatagramSocket muss die Zieladresse bei erstellten Zieladresse nicht angeben, da UDP keine Verbindung herstellen muss und jedes Datenpaket von einer anderen Zieladresse gesendet oder empfangen werden kann.
B. Wenn Sie wie TCP auf read () blockieren und warten, kann es dort für immer blockiert werden, da das UDP -Protokoll einfach das IP -Protokoll erweitert und die UDP -Pakete möglicherweise verloren gehen. Daher müssen Sie die Zeitüberschreitungszeit für das Blockieren des Warten festlegen.
Das C.UDP -Protokoll behält die Grenzinformationen der Nachricht bei, und jeder Empfang () kann nur die Daten erhalten, die die vom Send () -Methodenaufruf gesendeten Daten einmal gesendet haben.
D. Die maximalen Daten, die ein UDP -Paket übertragen können, sind 65507 Bytes. Die überschüssigen Bytes werden automatisch verworfen und es gibt keine Aufforderung für das Empfangsprogramm. Daher ist es sicher, das Cache -Array auf etwa 65.000 Bytes einzustellen.
E. Wenn die Receme () -Methode wiederholt mit derselben DataGrampacket -Instanz aufgerufen wird, muss die interne Länge der Nachricht vor jedem Aufruf explizit auf die tatsächliche Länge des Cache zurückgesetzt werden.