1. Deux principaux problèmes de programmation réseau
L'un est de savoir comment localiser avec précision un ou plusieurs hôtes sur le réseau, et l'autre est de savoir comment transmettre des données de manière fiable et efficace après avoir trouvé l'hôte.
Dans le protocole TCP / IP, la couche IP est principalement responsable de l'emplacement de l'hôte réseau et du routage de la transmission de données. L'adresse IP peut déterminer uniquement un hôte sur Internet.
La couche TCP fournit un mécanisme de transmission de données fiable (TCP) ou non fiable (UDP) pour l'application, qui est l'objet principal de la programmation réseau, et n'a généralement pas besoin de se soucier de la façon dont la couche IP traite les données.
Le modèle de programmation réseau le plus populaire est actuellement la structure client / serveur (C / S). Autrement dit, l'une des parties de communication agit comme un serveur pour attendre que le client soumette une demande et répond. Le client s'applique au serveur lorsque le service est nécessaire. Le serveur fonctionne généralement toujours comme un démon, écoutant le port réseau. Une fois qu'un client le demande, il lancera un processus de service pour répondre au client et continuera en même temps à écouter le port de service lui-même afin que les clients ultérieurs puissent également obtenir le service en temps opportun.
2. Deux types de protocoles de transmission: TCP; UDP
TCP est l'abréviation du Tranfer Control Protocol , un protocole orienté connexion qui assure une transmission fiable. La transmission via le protocole TCP entraîne un ordre de flux de données sans erreur. Une connexion doit être établie entre les deux paires de prises de l'expéditeur et le récepteur afin de communiquer sur la base du protocole TCP. Lorsqu'une prise (généralement une prise de serveur) attend pour établir une connexion, l'autre socket peut nécessiter une connexion. Une fois ces deux prises connectées, elles peuvent effectuer une transmission de données bidirectionnelle et les deux parties peuvent effectuer des opérations d'envoi ou de réception.
UDP est l'abréviation du User Datagram Protocol . Il s'agit d'un protocole sans connexion. Chaque datagramme est une information indépendante, y compris une adresse de source ou de destination complète. Il est transmis à la destination sur le réseau par n'importe quel chemin possible. Par conséquent, s'il peut atteindre la destination, le temps d'atteindre la destination et l'exactitude du contenu ne peut être garantie.
Comparer:
UDP:
TCP:
application:
3. Programmation du réseau Java basé sur des douilles
1. Qu'est-ce que la prise
Deux programmes sur le réseau réalisent l'échange de données via une connexion de communication bidirectionnelle. Une extrémité de ce lien bidirectionnel est appelée une prise. La prise est généralement utilisée pour se connecter entre les clients et les fournisseurs de services. Socket est une interface de programmation très populaire du protocole TCP / IP. Une prise est uniquement déterminée par une adresse IP et un numéro de port.
Cependant, les types de protocoles pris en charge par Socket ne sont pas seulement TCP / IP, il n'y a donc pas de connexion nécessaire entre les deux. Dans l'environnement Java, la programmation de socket se réfère principalement à la programmation réseau basée sur le protocole TCP / IP.
2. Le processus de communication de socket
Le côté serveur écoute (écoute) s'il existe une demande de connexion sur un certain port. Le côté client émet une demande de connexion au côté serveur et le côté serveur renvoie un message d'acceptation du côté client. Une connexion est établie. Le serveur et le côté client peuvent communiquer entre eux via Send, Write et d'autres méthodes.
Pour une prise entièrement fonctionnelle, il doit inclure la structure de base suivante et son processus de travail comprend les quatre étapes de base suivantes:
(1) Créer une prise;
(2) Ouvrez l'entrée / débit de sortie connectée à la prise;
(3) lire / écrire la prise en fonction d'un certain protocole;
(4) Fermer la prise. (Dans les applications réelles, la fermeture affichée n'est pas utilisée. Bien que de nombreux articles le recommandent, dans mon programme, il peut n'aura aucun impact car le programme lui-même est relativement simple et a des exigences faibles.)
3. Créer une prise
Socket (adresse InetAddress, port int); Socket (adresse InetAddress, port int, flux booléen); Socket (String Host, int prot); Socket (String Host, int prot, stream booléen); Socket (sockketimpl impl) socket (chaîne hôte, port int, inetAddress localAddr, int localport) socket (inetAddress Adresse, int port, inetAddress localAddr, int localport) serversocket (int port); SERVERSOCKET (int port, backlog int); SERVERSOCKET (port int, backlog int, InetAddress bindAdDDR) où l'adresse, l'hôte et le port sont l'adresse IP, le nom d'hôte et le numéro de port de l'autre partie dans la connexion bidirectionnelle respectivement. Le flux indique si la prise est une prise de flux ou une prise de datagramme. Localport indique que le numéro de port de l'hôte local, localAddr et BindAdDR sont l'adresse de la machine locale (l'adresse de l'hôte du Serversocket). IMP est la classe parent du socket, qui peut être utilisée pour créer SERVERSocket et créer des sockets. Le nombre représente le nombre maximum de connexions que le serveur peut prendre en charge. Par exemple: Apprentissage du réseau vidéo http://www.xxspw.com socket client = new socket ("127.0.01.", 80); SERVERSOCKET Server = new SERVERSocket (80);Notez que vous devez être prudent lors de la sélection d'un port. Chaque port fournit un service spécifique. Ce n'est qu'en donnant le port correct que le service correspondant peut être obtenu. Les numéros de port de 0 ~ 1023 sont réservés par le système. Par exemple, le numéro de port du service HTTP est de 80, le numéro de port du service Telnet est de 21 et le numéro de port du service FTP est de 23. Par conséquent, lorsque nous sélectionnons le numéro de port, il est préférable de choisir un nombre supérieur à 1023 pour éviter les conflits.
Si une erreur se produit lors de la création d'une prise, une IOException sera générée et elle doit être traitée dans le programme. Ainsi, lors de la création de socket ou de serveurs, des exceptions doivent être capturées ou lancées.
4. Programme client / serveur simple
1. Programme client
importer java.io. *; importer java.net. *; classe publique talkClient {public static void main (String args []) {try {socket socket = new socket ("127.0.0.1", 4700); // Envoyez une demande client au port 4700 de la machine BufferedReader Sin = new BufferedReader (new InputStreamReader (System.in)); // Construisez l'objet BufferedReader à partir du périphérique d'entrée standard système PrintWriter OS = new printwriter (socket.getOutputStream ()); // Obtenez le flux de sortie de l'objet Socket et construisez l'objet Printwriter BufferedReader est = new BufferedReader (new InputStreamReader (socket.getInputStream ())); // Obtenez le flux d'entrée de l'objet Socket et construisez la lecture de chaîne d'objet BuffereDReader correspondante; readLine = sin.readline (); // Lire une chaîne à partir de l'entrée standard du système while (! ReadLine.equals ("bye")) {// Si la chaîne lue à partir de l'entrée standard est "BYE", arrêtez la boucle os.println (readline); // Sortie de la chaîne lue à partir de l'entrée standard du système sur serveur os.flush (); // actualiser le flux de sortie afin que le serveur reçoive immédiatement la chaîne System.out.println ("Client:" + readline); // imprime la chaîne de lecture System.out.println ("Server:" + IS.Readline ()); // Lisez une chaîne du serveur et imprimez-la vers la sortie standard readLine = sin.readline (); // Lire une chaîne à partir de l'entrée standard du système} // Continuez à boucle OS.Close (); // Le flux de sortie de socket fermer est.close (); // fermer socket socket socket.close (); // fermeture} catch (exception e) {System.out.println ("error" + e); // une erreur se produit, un message d'erreur est imprimé}}}2. Programme côté serveur
importer java.io. *; importer java.net. *; import java.applet.applet; classe publique talkserver {public static void main (String args []) {try {serversocket server = null; essayez {server = new serversocket (4700); // Créer un SERVERSOCKET pour écouter les demandes des clients sur le port 4700} catch (exception e) {System.out.println ("ne peut pas écouter:" + e); // Erreur, message d'erreur d'impression} socket socket = null; essayez {socket = server.accept (); // Utilisez accepter () pour bloquer et attendre la demande du client. Si un client // après la demande est venu, un objet Socket est généré et continue d'exécuter} catch (exception e) {System.out.println ("Error." + E); // Une erreur se produit, les informations d'erreur d'impression sont imprimées} ligne de chaîne; BufferedReader est = new BufferedReader (new InputStreamReader (socket.getInputStream ())); // Obtenez le flux d'entrée de l'objet Socket et construisez l'objet BuffereDReader correspondant printwriter os = newPrintWriter (socket.getOutputStream ()); // Obtenez le flux de sortie de l'objet Socket et construisez l'objet Printwriter BufferedReader Sin = new BufferedReader (new InputStreamReader (System.in)); // Construisez le System d'objet BufferedReader.out.println ("Client:" + is.readline ()); // imprime la chaîne lue à partir du client sur la ligne de sortie standard = sin.readline (); // Lire une chaîne à partir de l'entrée standard while (! Line.equals ("bye")) {// Si la chaîne est "bye", arrêtez la boucle os.println (ligne); // sortit la chaîne os.flush () au client; // actualiser le flux de sortie afin que le client reçoive immédiatement la chaîne System.out.println ("Server:" + ligne); // Imprimez la chaîne de lecture System.out.println ("Client:" + is.readline ()); // Lisez une chaîne du client et imprimez-la à la ligne de sortie standard = sin.readline (); // Lire une chaîne à partir de l'entrée standard du système} // Continuez à boucle OS.Close (); // Le flux de sortie de socket fermer est.close (); // fermer socket socket socket.close (); // fermer socket server.close (); // Close Serversocket} catch (exception e) {System.out.println ("Erreur:" + e); // une erreur s'est produite, imprimer le message d'erreur}}}5. Prise en charge du programme client / serveur multi-client
Le programme client / serveur précédent ne peut implémenter que des conversations entre le serveur et un client. Dans les applications réelles, un programme permanent est souvent exécuté sur le serveur, qui peut recevoir des demandes de plusieurs autres clients et fournir des services correspondants. Afin de réaliser la fonction de fournir des services à plusieurs clients sur le serveur, le programme ci-dessus doit être transformé et le mécanisme multi-threading est implémenté. Le serveur écoute toujours s'il y a des demandes client sur le port spécifié. Une fois la demande du client entendu, le serveur lancera un thread de service spécial pour répondre à la demande du client. Le serveur lui-même entre immédiatement dans l'état d'écoute après avoir commencé le thread, attendant l'arrivée du client suivant.