1. Introduction à TCP / IP
La famille du protocole TCP / IP est un protocole utilisé par Internet et peut également être utilisé dans des réseaux privés indépendants.
La famille du protocole TCP / IP comprend le protocole IP, le protocole TCP et le protocole UDP.
Le protocole IP utilise des adresses IP pour distribuer des paquets, mais il s'agit d'un service le mieux effectif, et les paquets peuvent être perdus, hors service ou répétés. Les protocoles TCP et UDP ajoutent des numéros de port au protocole IP, établissant ainsi une connexion transparente entre les applications des deux hôtes.
La différence est que le protocole TCP corrige les erreurs de couche IP, qui établit des connexions entre les hôtes via des messages de poignée de main.
Ensuite, les erreurs dans le message sont restaurées en ajoutant un numéro de série au message. UDP étend simplement le protocole IP.
Activez-le à travailler entre les applications, pas entre les hôtes.
En ce qui concerne les adresses IP, un hôte peut avoir plusieurs interfaces réseau et une interface peut avoir plusieurs adresses.
Certaines adresses IP ont des utilisations spéciales:
A. Adresse de bouclage: 127.0.0.1, est toujours attribuée à une interface de bouclage, principalement utilisée pour les tests.
B. Adresse privée: à partir de 10, 192.168, 172. (16-31), utilisé pour les réseaux privés. Lorsqu'un appareil NAT transmet un message, il mappe la paire de port d'adresse privée du message dans une interface dans la paire de port d'adresse publique dans une autre interface. Cela permet à un petit groupe d'hôtes de partager une paire d'adresses IP.
C. Adresse de multidiffusion: le premier numéro se situe entre 224 et 239.
2. Bases à douille
1. Obtention d'adresse
public static void main (String [] args) {try {énumération <neworkInterface> interfaces = NetworkInterface.getNetWorkInterfaces (); while (interfaces.hasmoreElements ()) {NetworkInterface iface = interfaces.NextElement (); System.out.println ("Interface:" + iface.getName ()); Énumération <netAddress> addrlist = iface.getInTAddress (); if (! addrlist.hasmoreElements ()) System.out.println ("pas d'adresse"); while (addrlist.hasmoreElements ()) {InetAddress adresse = addrlist.NextElement (); System.out.println ("Adresse:" + Adresse.GethostAddress ()); }}} catch (socketException e) {e.printStackTrace (); }}2. Programme d'instance TCP
Il convient de noter que bien qu'une seule méthode écrite () soit utilisée pour envoyer des chaînes du côté client, le côté serveur peut également recevoir ces informations à partir de plusieurs blocs. Même si la chaîne de rétroaction est stockée dans un bloc lorsque le serveur revient, il peut être TCP
Le protocole est divisé en plusieurs parties.
Tcpechoclienttest.java
public static void main (String [] args) lève ioException {String Server = args [0]; octet [] data = args [1] .getBytes (); int port = 7; Socket socket = new socket (serveur, port); System.out.println ("connecté au serveur ..."); InputStream dans = socket.getInputStream (); OutputStream out = socket.getOutputStream (); out.write (données); int totalBytesrcvd = 0; int bytesrcvd; while (totalBytesrcvd <data.length) {if ((bytesrcvd = in.read (data, totalBytesrcvd, data.length - totalBytesrcvd)) == -1) lancez new socketException ("connexion clôturée"); totalBytesrcvd + = bytesrcvd; } System.out.println ("Reçu:" + Nouvelle chaîne (données)); socket.close (); }TcpechoServerTest.java
Final statique privé int bufsize = 32; public static void main (String [] args) lève ioException {Serversocket SERVERSOCKET = new serversocket (7); int recvmsgsize; octet [] receseBuf = nouveau octet [bufSize]; while (true) {socket socket = serversocket.accept (); System.out.println ("Gestion du client" + "de la distance" + socket.getRemotesocketAddress () + "AT LOCAL" + socket.getLocalsocketAddress ()); InputStream dans = socket.getInputStream (); OutputStream out = socket.getOutputStream (); while ((recvmsgsize = in.read (recesebuf))! = -1) {out.write (recesebuf, 0, recvmsgsize); } socket.close (); }}Notez que le nouveau socket spécifie le numéro de port auquel le serveur distant écoute sans spécifier le port local, donc l'adresse par défaut et le numéro de port disponible seront utilisés. Sur mon port client machine est 4593, connecté au port 7 du serveur.
3. Programme d'instance UDP
Pourquoi utiliser le protocole UDP? Si l'application échange uniquement une petite quantité de données, la phase d'établissement de la connexion TCP transmettra au moins deux fois ses informations (et deux fois le temps aller-retour).
Udpechoclienttest.java
public static void main (String [] args) lève ioException {InetAddress ServerAddress = InetAddress.getByName (args [0]); octet [] byTestoSend = args [1] .getBytes (); DatagramSocket socket = new DatagramSocket (); Socket.SetSoTimeout (3000); Datagrampacket sendPacket = new Datagrampacket (byTestoSend, byTestoSend.length, serverAddress, 7); Datagrampacket recesepacket = new Datagrampacket (new octet [byTestoSend.length], byTestoSend.length); // Les paquets peuvent être perdus, nous devons donc continuer d'essayer les essais int = 0; Boolean reçoit la réponse = false; do {socket.send (sendPacket); essayez {socket.receive (recesepacket); if (! recesepacket.getAddress (). Equals (ServerAddress)) lancez une nouvelle ioException ("Recevoir de Source inconnue"); reçueResponse = true; } catch (ioException e) {tries ++; System.out.println ("Timeout, essayez à nouveau"); }} while (! ReçuSponse && essais <5); if (reçuResponse) System.out.println ("reçu:" + new String (recesepacket.getData ())); else System.out.println ("aucune réponse"); socket.close (); } UdpechoServerTest.java
Int final statique privé Echomax = 255; public static void main (String [] args) lève ioException {datagramsocket socket = new DatagramSocket (7); Datagrampacket Packet = new Datagrampacket (nouveau octet [echomax], echomax); while (true) {socket.receive (paquet); System.out.println ("Gestion du client sur" + paquet.getAddress ()); Socket.Send (paquet); paquet.setLength (eChomax); }}En comparant cet exemple avec l'instance TCP précédente, il existe les différences suivantes:
A.DatagramSocket n'a pas besoin de spécifier l'adresse de destination lors de sa création, car UDP n'a pas besoin d'établir de connexion, et chaque paquet de données peut être envoyé ou reçu d'une adresse de destination différente.
B. Si vous bloquez et attendez la lecture () comme TCP, il peut y être bloqué pour toujours, car le protocole UDP étend simplement le protocole IP, et les paquets UDP peuvent être perdus. Par conséquent, vous devez définir l'heure du délai d'expiration pour bloquer l'attente.
Le protocole C.UDP conserve les informations limites du message, et chaque appel reçoit () ne peut recevoir les données envoyées par l'appel de la méthode Send () une fois.
D. Les données maximales qu'un paquet UDP peuvent transmettre est de 65507 octets. Les octets excédentaires seront automatiquement rejetés et il n'y a aucune invite pour le programme de réception. Par conséquent, il est sûr de régler le réseau de cache à environ 65 000 octets.
E. Si la méthode reçoit () est appelée à plusieurs reprises avec la même instance de Datagrampacket, la longueur interne du message doit être réinitialisée explicitement à la longueur réelle du cache avant chaque appel.