Java fournit deux classes pour le protocole TCP, qui sont utilisées respectivement dans la programmation côté client et dans la programmation côté serveur. Avant que l'application ne démarre la communication, une connexion doit d'abord être créée, initiée par le programme client ; et le programme côté serveur doit toujours écouter le numéro de port spécifique de l'hôte, en attendant la connexion du client. Dans le client, nous devons uniquement utiliser des instances Socket, tandis que le serveur doit gérer à la fois les instances ServerSocket et les instances Socket, qui utilisent OutputStream et InpuStream pour envoyer et recevoir des données.
La meilleure façon d'acquérir une connaissance est de l'utiliser. Grâce aux notes précédentes, nous savons déjà comment obtenir les informations d'adresse de l'hôte. Nous utilisons maintenant un programme simple pour apprendre dans un premier temps la programmation Socket en utilisant le protocole TCP dans le transport. couche.
Côté serveur TCP
Dans la programmation Socket, le côté serveur est beaucoup plus compliqué que le côté client. Le travail du serveur consiste à établir un terminal de communication et à attendre passivement la connexion du client. L'exemple suivant de programme côté serveur est utilisé pour écouter le numéro de port obtenu à partir de l'entrée de la console et renvoyer le message envoyé par le client.
Copiez le code comme suit :
importjava.net.*;
importjava.text.MessageFormat;
importjava.io.*;
publicclassTCPEchoServer{
privatestaticfinalintBUFSIZE=32 ;
publicstaticvoidmain(String[]args)throwsIOException{
//TODOStub de méthode généré automatiquement
//Récupère le numéro de port à surveiller depuis la console
si(args.length!=1)
thrownewIllegalArgumentException("Paramètre(s):<Port>");
//Obtenir le numéro de port
intservPort=Integer.parseInt(args[0]);
//Instancier une instance d'objet ServerSocket
ServerSocketservSocket=newServerSocket(servPort);
System.out.println(MessageFormat.format("Démarrer l'écoute, numéro de port : {0}",args[0]));
//Nombre total d'octets de données initiales reçues
intrecvMsgSize;
//tampon pour recevoir des données
octet[]receiveBuf=newbyte[BUFSIZE];
//Itération en boucle, écoute du numéro de port et traitement des nouvelles demandes de connexion
tandis que(vrai){
//Bloquer et attendre, créer une nouvelle instance de connexion à chaque fois qu'une requête est reçue
SocketclntSocket=servSocket.accept();
//Obtenir la SocketAddress du client connecté
SocketAddressclientAddress=clntSocket.getRemoteSocketAddress();
//Imprime les informations sur l'adresse du client de connexion
System.out.println("Handlingclientat"+clientAddress);
//Objet qui reçoit les données du client
InputStream=clntSocket.getInputStream();
//Objet qui envoie des données au client
OutputStreamout=clntSocket.getOutputStream();
//Après avoir lu les données envoyées par le client, envoyez-les au client
while((recvMsgSize=in.read(receiveBuf))!=-1){
out.write(receiveBuf,0,recvMsgSize);
}
//Lorsque le client ferme la connexion, fermez la connexion
System.out.println("Le client ferme la connexion");
clntSocket.close();
}
}
}
Client TCP
Dans la programmation Socket, le client doit d'abord envoyer au serveur, puis attendre passivement la réponse du serveur. Dans l'exemple suivant : nous envoyons des informations au serveur, attendons le message envoyé par le serveur et l'imprimons.
Copiez le code comme suit :
importjava.io.*;
importjava.net.Socket ;
importjava.net.SocketException;
publicclassTCPEchoClient{
publicstaticvoidmain(String[]args)throwsIOException{
//TODOStub de méthode généré automatiquement
//Détermine si les paramètres reçus de la console sont corrects
si((args.length<2)||(args.length>3))
thrownewIllegalArgumentException(
"Paramètre(s) :<Serveur><Mot>[<Port>]]");
//Obtenir l'adresse du serveur
Serveur de chaînes=args[0];
//Récupère les informations qui doivent être envoyées
byte[]data=args[1].getBytes();
//S'il y a trois paramètres esclaves, obtenez le numéro de port pour envoyer les informations. Le numéro de port par défaut est 8099.
intservPort=(args.length==3)?Integer.parseInt(args[2]):8099;
//Instancier une instance Socket en fonction de l'adresse du serveur et du numéro de port
Socketsocket=newSocket(serveur,servPort);
System.out.println("Connecté au serveur...envoi d'une chaîne d'écho");
//Renvoie le flux d'entrée de ce socket, qui est l'objet de données reçu du serveur
InputStream=socket.getInputStream();
//Renvoie le flux de sortie de ce socket, qui est l'objet de données envoyé au serveur
OutputStreamout=socket.getOutputStream();
//Envoie les données reçues de la console au serveur
out.write(données);
//Le compteur qui reçoit les données écrira le décalage initial des données
inttotalBytesRcvd=0;
//Initialiser le nombre total d'octets de données reçues
intbytesRcvd;
while(totalBytesRcvd<data.length){
//Si le serveur ferme la connexion, il renvoie -1. La méthode read renvoie le nombre total d'octets de données reçues.
if((bytesRcvd=in.read(data,totalBytesRcvd,data.length
-totalBytesRcvd))==-1)
thrownewSocketException("La connexion au serveur a été fermée");
totalBytesRcvd+=octetsRcvd;
}
//Imprime les données envoyées par le serveur
System.out.println("Reçu :"+newString(data));
//Ferme la connexion
socket.close();
}
}
Exécutez d’abord le serveur et écoutez sur le port 8099 :
Exécutez ensuite le programme client et envoyez un message au serveur :
En regardant à nouveau notre console côté serveur, nous pouvons voir les informations d'adresse de la connexion client précédente :