Java – Réseautage
Le terme programmation réseau fait référence à l'écriture de programmes qui s'exécutent sur plusieurs appareils (ordinateurs), dans lesquels les appareils sont tous connectés les uns aux autres à l'aide d'un réseau.
Le package java.net des API J2SE contient une collection de classes et d'interfaces qui fournissent les détails de communication de bas niveau, vous permettant d'écrire des programmes qui se concentrent sur la résolution du problème en cours.
Le package java.net prend en charge les deux protocoles réseau courants −
-
TCP − TCP signifie Transmission Control Protocol, qui permet une communication fiable entre deux applications. TCP est généralement utilisé sur le protocole Internet, appelé TCP/IP.
-
UDP − UDP signifie User Datagram Protocol, un protocole sans connexion qui permet la transmission de paquets de données entre applications.
Ce chapitre permet de bien comprendre les deux sujets suivants −
-
Programmation des sockets − C'est le concept le plus largement utilisé dans le réseautage et il a été expliqué en détail.
-
Traitement des URL − Cela serait couvert séparément. Cliquez ici pour en savoir plus sur le traitement d'URL en langage Java.
Programmation des sockets
Les sockets fournissent le mécanisme de communication entre deux ordinateurs utilisant TCP. Un programme client crée un socket à son extrémité de la communication et tente de connecter ce socket à un serveur.
Lorsque la connexion est établie, le serveur crée un objet socket à son extrémité de la communication. Le client et le serveur peuvent maintenant communiquer en écrivant et en lisant depuis le socket.
La classe java.net.Socket représente un socket, et la classe java.net.ServerSocket fournit un mécanisme permettant au programme serveur d'écouter les clients et d'établir des connexions avec eux.
Les étapes suivantes se produisent lors de l'établissement d'une connexion TCP entre deux ordinateurs à l'aide de sockets −
-
Le serveur instancie un objet ServerSocket, indiquant sur quel numéro de port la communication doit se produire.
-
Le serveur invoque la méthode accept() de la classe ServerSocket. Cette méthode attend qu'un client se connecte au serveur sur le port donné.
-
Une fois le serveur en attente, un client instancie un objet Socket, en spécifiant le nom du serveur et le numéro de port auquel se connecter.
-
Le constructeur de la classe Socket tente de connecter le client au serveur spécifié et au numéro de port. Si la communication est établie, le client dispose alors d'un objet Socket capable de communiquer avec le serveur.
-
Côté serveur, la méthode accept() renvoie une référence à un nouveau socket sur le serveur qui est connecté au socket du client.
Une fois les connexions établies, la communication peut se produire à l'aide de flux d'E/S. Chaque socket a à la fois un OutputStream et un InputStream. L'OutputStream du client est connecté à l'InputStream du serveur et l'InputStream du client est connecté à l'OutputStream du serveur.
TCP est un protocole de communication bidirectionnel, les données peuvent donc être envoyées sur les deux flux en même temps. Voici les classes utiles fournissant un ensemble complet de méthodes pour implémenter les sockets.
Méthodes de la classe ServerSocket
Le java.net.ServerSocket La classe est utilisée par les applications serveur pour obtenir un port et écouter les requêtes des clients.
La classe ServerSocket a quatre constructeurs −
Sr.No. | Méthode et description |
---|---|
1 | |
2 | |
3 | |
4 |
Si le constructeur ServerSocket ne lève pas d'exception, cela signifie que votre application s'est liée avec succès au port spécifié et est prête pour les requêtes client.
Voici quelques-unes des méthodes courantes de la classe ServerSocket −
Sr.No. | Méthode et description |
---|---|
1 | |
2 | |
3 | |
4 |
Lorsque le ServerSocket appelle accept(), la méthode ne revient pas tant qu'un client ne se connecte pas. Une fois qu'un client s'est connecté, le ServerSocket crée un nouveau Socket sur un port non spécifié et renvoie une référence à ce nouveau Socket. Une connexion TCP existe maintenant entre le client et le serveur, et la communication peut commencer.
Méthodes de classe de socket
Le java.net.Socket La classe représente le socket que le client et le serveur utilisent pour communiquer entre eux. Le client obtient un objet Socket en en instanciant un, tandis que le serveur obtient un objet Socket à partir de la valeur de retour de la méthode accept().
La classe Socket a cinq constructeurs qu'un client utilise pour se connecter à un serveur −
Sr.No. | Méthode et description |
---|---|
1 | |
2 | |
3 | |
4 | |
5 |
Lorsque le constructeur Socket revient, il n'instancie pas simplement un objet Socket, mais il tente en fait de se connecter au serveur et au port spécifiés.
Certaines méthodes intéressantes de la classe Socket sont répertoriées ici. Notez que le client et le serveur ont tous deux un objet Socket, de sorte que ces méthodes peuvent être invoquées à la fois par le client et le serveur.
Sr.No. | Méthode et description |
---|---|
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 |
Méthodes de la classe InetAddress
Cette classe représente une adresse IP (Internet Protocol). Voici les méthodes utiles suivantes dont vous auriez besoin lors de la programmation de socket −
Sr.No. | Méthode et description |
---|---|
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 |
Exemple de client de socket
Le GreetingClient suivant est un programme client qui se connecte à un serveur à l'aide d'un socket et envoie un message d'accueil, puis attend une réponse.
Exemple
// File Name GreetingClient.java import java.net.*; import java.io.*; public class GreetingClient { public static void main(String [] args) { String serverName = args[0]; int port = Integer.parseInt(args[1]); try { System.out.println("Connecting to " + serverName + " on port " + port); Socket client = new Socket(serverName, port); System.out.println("Just connected to " + client.getRemoteSocketAddress()); OutputStream outToServer = client.getOutputStream(); DataOutputStream out = new DataOutputStream(outToServer); out.writeUTF("Hello from " + client.getLocalSocketAddress()); InputStream inFromServer = client.getInputStream(); DataInputStream in = new DataInputStream(inFromServer); System.out.println("Server says " + in.readUTF()); client.close(); } catch (IOException e) { e.printStackTrace(); } } }
Exemple de serveur de socket
Le programme GreetingServer suivant est un exemple d'application serveur qui utilise la classe Socket pour écouter les clients sur un numéro de port spécifié par un argument de ligne de commande −
Exemple
// File Name GreetingServer.java import java.net.*; import java.io.*; public class GreetingServer extends Thread { private ServerSocket serverSocket; public GreetingServer(int port) throws IOException { serverSocket = new ServerSocket(port); serverSocket.setSoTimeout(10000); } public void run() { while(true) { try { System.out.println("Waiting for client on port " + serverSocket.getLocalPort() + "..."); Socket server = serverSocket.accept(); System.out.println("Just connected to " + server.getRemoteSocketAddress()); DataInputStream in = new DataInputStream(server.getInputStream()); System.out.println(in.readUTF()); DataOutputStream out = new DataOutputStream(server.getOutputStream()); out.writeUTF("Thank you for connecting to " + server.getLocalSocketAddress() + "\nGoodbye!"); server.close(); } catch (SocketTimeoutException s) { System.out.println("Socket timed out!"); break; } catch (IOException e) { e.printStackTrace(); break; } } } public static void main(String [] args) { int port = Integer.parseInt(args[0]); try { Thread t = new GreetingServer(port); t.start(); } catch (IOException e) { e.printStackTrace(); } } }
Compilez le client et le serveur puis démarrez le serveur comme suit −
$ java GreetingServer 6066 Waiting for client on port 6066...
Vérifiez le programme client comme suit −
Sortie
$ java GreetingClient localhost 6066 Connecting to localhost on port 6066 Just connected to localhost/127.0.0.1:6066 Server says Thank you for connecting to /127.0.0.1:6066 Goodbye!
Java