Socket, également connu sous le nom de sockets, est l'une des technologies de base pour la communication du réseau informatique. Aujourd'hui, la plupart des logiciels Web, tels que les navigateurs, les outils de messagerie instantanée et même les téléchargements P2P, sont implémentés en fonction de Socket. Cet article présentera la programmation de socket basée sur TCP / IP et comment rédiger un programme client / serveur.
Dessert avant le dîner
Le système d'entrée et de sortie (IO) d'UNIX suit des modèles de fonctionnement tels que la lecture ouverte-écrite-casque. Avant qu'un processus utilisateur effectue des opérations IO, il doit appeler ouvert pour spécifier et obtenir des autorisations pour que le fichier ou l'appareil soit utilisé pour lire ou écrire. Une fois l'objet d'opération IO ouvert, le processus utilisateur peut effectuer une ou plusieurs opérations de lecture ou d'écriture sur l'objet. L'opération de lecture est utilisée pour lire les données des objets d'opération IO et passer les données au processus utilisateur. L'opération d'écriture est utilisée pour transmettre des données (écrire) dans les processus utilisateur vers les objets d'opération IO. Une fois les opérations de lecture et d'écriture terminées, le processus utilisateur doit appeler près pour informer le système qu'il termine son utilisation de l'objet IO.
Lorsque Unix a commencé à prendre en charge la communication interprocess (IPC), l'interface IPC a été conçue pour être similaire à l'interface de fonctionnement du fichier IO. Dans Unix, un processus aura un ensemble de descripteurs IO qui peuvent être lus et écrits. Le descripteur IO peut être un fichier, un appareil ou un canal de communication (socket socket). Un descripteur de fichiers se compose de trois parties: création (socket d'ouverture), lecture et rédaction de données (accepter et envoyer au socket) et détruire (socket de fermeture).
Dans Unix Systems, la version de type BSD de l'interface IPC est implémentée en tant que couche au-dessus des protocoles TCP et UDP. La destination du message est représentée par l'adresse de socket. Une adresse de socket est un identifiant de communication composé d'une adresse réseau et d'un numéro de port.
Les opérations de communication entre les processus nécessitent une paire de prises. La communication inter-processus est réalisée par transmission de données entre une prise dans un processus et une autre prise dans un autre processus. Lorsqu'un message est exécuté et envoyé, le message est en file d'attente dans la prise à l'extrémité d'envoi jusqu'à ce que le protocole réseau de niveau inférieur envoie les messages. Lorsque le message atteint la prise à l'extrémité de réception, elle sera également dans une file d'attente jusqu'à ce que le processus à l'extrémité de réception reçoive le message.
Communication TCP et UDP
En ce qui concerne la programmation de socket, nous avons deux protocoles de communication à choisir. L'un est la communication de datagram, l'autre est la communication de flux.
Communication de datagramme
Le protocole de communication Datagram est ce que nous appelons souvent UDP (protocole de données utilisateur). UDP est un protocole sans connexion, ce qui signifie que chaque fois que nous envoyons des datagrammes, nous devons envoyer le descripteur de socket de la machine native et le descripteur de socket du récepteur en même temps. Par conséquent, nous devons envoyer des données supplémentaires à chaque fois que nous communiquons.
Communication des cours d'eau
Le protocole de communication du flux, également connu sous le nom de TCP (protocole de contrôle de transfert) est également appelé TCP (protocole de contrôle de transfert). Contrairement à l'UDP, TCP est un protocole basé sur la connexion. Avant d'utiliser la communication de flux, nous devons établir une connexion entre la paire de prises de communication. L'une des sockets sert de serveur pour écouter les demandes de connexion. L'autre fait des demandes de connexion en tant que client. Une fois que les deux sockets ont établi une connexion, ils peuvent transférer des données à sens unique ou à double sens.
Après avoir lu ceci, nous avons des questions sur le fait que nous utilisons UDP ou TCP pour la programmation de socket. Le choix de la programmation de socket en fonction du protocole basé sur votre scénario d'application spécifique dépend de votre programme de serveur client spécifique. Ci-dessous, nous analysons brièvement la différence entre les protocoles TCP et UDP, ce qui peut vous aider à mieux choisir celui à utiliser.
Dans UDP, chaque fois qu'un datagramme est envoyé, le descripteur de socket de la machine native et le descripteur de socket du récepteur doivent être inclus. Étant donné que TCP est un protocole basé sur la connexion, une connexion doit être établie entre les paires de socket de communication avant la communication, il y aura donc une programmation de connexion qui prend du temps dans le protocole TCP.
Dans UDP, les données Datagram ont une limite de 64 Ko. Il n'y a pas une telle restriction dans TCP. Une fois que la paire de douilles de communication TCP établit une connexion, la communication entre eux est similaire à un flux IO et toutes les données seront lues dans l'ordre, elles sont acceptées.
L'UDP est un protocole peu fiable, et les datagrammes envoyés ne sont pas nécessairement acceptés par la prise de réception dans l'ordre dans lequel ils sont envoyés. Ensuite, TCP est un protocole fiable. L'ordre des paquets reçus par l'extrémité de réception est conforme à l'ordre des paquets à la fin d'envoi.
En bref, TCP convient aux services réseau tels que la connexion distante (Rlogin, Telnet) et le transfert de fichiers (FTP). Parce que la taille de ces données qui doit être transmise est incertaine. L'UDP est plus simple et plus léger que TCP. UDP est utilisé pour mettre en œuvre certains services plus réels ou n'a aucune importance à la perte de paquets. Le taux de perte de paquets de UDP dans LAN est relativement faible.
Programmation de socket en java
Dans la section suivante, j'expliquerai comment utiliser Socket pour écrire des programmes clients et serveurs via quelques exemples.
Remarque: Dans l'exemple suivant, j'utiliserai la programmation de socket basée sur le protocole TCP / IP, car ce protocole est beaucoup plus largement utilisé que UDP / IP. Et toutes les classes liées à la prise sont situées dans le package Java.net, nous devons donc introduire ce package lorsque nous effectuons une programmation de socket.
Rédaction du client
Allumer
Si vous êtes du côté client, vous devez écrire le code suivant pour ouvrir une prise.
String host = "127.0.0.1"; int port = 8919; socket client = new socket (hôte, port);
Dans le code ci-dessus, l'hôte est la machine à laquelle le client doit se connecter, et le port est le port utilisé par le serveur pour écouter la demande. Lors de la sélection d'un port, une chose à laquelle vous devez faire attention est que les ports tels que 0 ~ 1023 ont été réservés par le système. Ces ports sont utilisés par certains services couramment utilisés, tels que Mail, FTP et HTTP. Lorsque vous rédigez du code côté serveur et sélectionnez un port, veuillez sélectionner un port supérieur à 1023.
Écrire des données
Ensuite, c'est d'écrire les données de demande. Nous obtenons l'objet OutputStream de l'objet Socket du client, puis écrivons les données. Très similaire au code de traitement des fichiers IO.
classe publique Clientsocket {public static void main (String args []) {String host = "127.0.0.1"; int port = 8919; try {socket client = new socket (hôte, port); Écrivain écrivain = new outputStreamWriter (client.getOutputStream ()); writer.write ("Hello from client"); écrivain.flush (); écrivain.close (); client.close (); } catch (ioException e) {e.printStackTrace (); }}}Fermer l'objet IO
Semblable au fichier IO, après avoir lu et écrit des données, nous devons fermer l'objet IO pour assurer la version correcte des ressources.
Écriture côté serveur
Ouvrez la prise côté serveur
int port = 8919; serversocket server = new serversocket (port); socket socket = server.accept ();
Le code ci-dessus crée une prise côté serveur, puis appelle la méthode d'accepter pour écouter et obtenir la prise de demande du client. La méthode d'acceptation est une méthode de blocage qui attend le blocage jusqu'à ce qu'une connexion soit établie entre le serveur et le client.
Lire les données
Obtenez l'objet InputStream via l'objet Socket obtenu ci-dessus, puis installez le fichier IO pour lire les données. Ici, nous imprimons le contenu.
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 [] = nouveau char [1024]; int len; StringBuilder Builder = new StringBuilder (); while ((len = reader.read (chars))! = -1) {builder.append (new String (chars, 0, len)); } System.out.println ("Recevoir de Client Message =:" + Builder); Reader.Close (); socket.close (); server.close (); } catch (exception e) {e.printStackTrace (); }}}Fermer l'objet IO
Il ne peut pas être oublié. Enfin, j'ai besoin de fermer correctement l'objet IO pour assurer la libération correcte des ressources.
Noter un exemple
Ici, nous ajoutons un exemple, en utilisant Socket pour implémenter un serveur Echo, c'est-à-dire que le serveur transmettra les données envoyées par le client au client. Le code est très simple.
import java.io. *; import java.net. *; public class eChoserver {public static void main (String args []) {// section de déclaration: // Déclare un socket serveur et un socket client pour le serveur // Déclare une entrée et un flux de sortie Serversocket Echoserver = null; Ligne de chaîne; DatAnputStream est; PrintStream OS; Socket ClivitySocket = NULL; // Essayez d'ouvrir une prise de serveur sur le port 9999 // Notez que nous ne pouvons pas choisir un port inférieur à 1023 si nous ne sommes pas // utilisateurs privilégiés (root) try {eChoserver = new Serversocket (9999); } catch (ioException e) {System.out.println (e); } // Créez un objet Socket à partir de Serversocket pour écouter et accepter // des connexions. // Ouvrir les flux d'entrée et de sortie essaiment {clientSocket = eChoServer.Accept (); is = new DataRainputStream (clients.getInputStream ()); OS = new PrintStream (ClientSocket.GetOutputStream ()); // Tant que nous recevons des données, faites écho à ces données au client. while (true) {line = is.readline (); os.println (ligne); }} catch (ioException e) {System.out.println (e); }}}Compiler et exécuter le code ci-dessus et faire la demande suivante, vous pouvez voir le contenu des données transportées par la demande du client.
15:00 $ curl http://127.0.0.1:9999/ ?111get /? 111 http / 1.1User-agent: curl / 7.37.1host: 127.0.0.1:9999accept: * / *
Résumer
Il est assez intéressant d'effectuer une programmation client-serveur, et la programmation de socket en Java est plus facile et plus rapide que les autres langages (tels que C).
Le package java.net contient de nombreuses classes puissantes et flexibles pour les développeurs pour programmer des réseaux. Lors de la programmation des réseaux, il est recommandé d'utiliser l'API sous ce package. Dans le même temps, le package Sun. * contient également de nombreuses classes liées à la programmation réseau, mais il n'est pas recommandé d'utiliser l'API sous ce package, car ce package peut changer. De plus, ce package ne peut être garanti pour être inclus sur toutes les plateformes.
Ce qui précède est une compilation des informations Java Socket. Nous continuerons d'ajouter des connaissances pertinentes à l'avenir. Merci pour votre soutien pour ce site Web!