English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
La programmation réseau consiste à écrire des programmes qui s'exécutent sur plusieurs appareils (ordinateurs) connectés ensemble via un réseau.
J2Les API de SE contiennent des classes et des interfaces qui fournissent des détails de communication de bas niveau. Vous pouvez utiliser directement ces classes et interfaces pour vous concentrer sur la résolution des problèmes, sans vous soucier des détails de communication.
Le paquet java.net fournit le support pour deux protocoles réseau courants :
TCP:TCP (Transmission Control Protocol, protocole de contrôle de transmission) est un protocole de communication de couche de transport orienté connexion, fiable et basé sur un flux de octets. La couche TCP est située entre la couche IP et la couche applicative. TCP garantit une communication fiable entre deux applications. Il est généralement utilisé dans les protocoles IP, et est appelé TCP. / IP.
UDP:UDP (User Datagram Protocol, protocole de datagramme utilisateur), se situe au niveau de la couche de transport du modèle OSI. Un protocole sans connexion. Fournit des datagrammes pour que les applications puissent envoyer des données. En raison du manque de fiabilité de UDP et de son caractère sans connexion, les applications doivent généralement permettre certaines pertes, erreurs ou répétitions de paquets.
Ce tutoriel traite principalement des deux sujets suivants.
Programmation Socket:C'est le concept de réseau le plus largement utilisé, qui a été expliqué de manière très détaillée.
Traitement des URL:Cette partie sera expliquée dans un autre article, cliquez ici pour en savoir plus sur Traitement des URL en Java.
Les sockets utilisent TCP pour fournir un mécanisme de communication entre deux ordinateurs. Le programme client crée un socket et tente de se connecter au socket du serveur.
Lorsque la connexion est établie, le serveur crée un objet Socket. Le client et le serveur peuvent maintenant communiquer en écrivant et en lisant sur l'objet Socket.
La classe java.net.Socket représente un socket et la classe java.net.ServerSocket fournit un mécanisme pour le programme serveur pour écouter les clients et é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 pour représenter la communication par le port sur le serveur.
Le serveur appelle la méthode accept() de la classe ServerSocket, qui attendra jusqu'à ce que le client se connecte au port spécifié sur le serveur.
Lorsque le serveur attend, un client instancie un objet Socket, spécifie le nom du serveur et le port pour demander une connexion.
Le constructeur de la classe Socket essaie de connecter le client au serveur et au port spécifiés. Si la communication est établie, un objet Socket est créé sur le client pour communiquer avec le serveur.
Du côté serveur, la méthode accept() renvoie une nouvelle référence de socket sur le serveur, connectée au socket du client.
Après l'établissement de la connexion, utilisez I/Dans la communication par flux O, chaque socket a un flux de sortie et un flux d'entrée. Le flux de sortie du client est connecté au flux d'entrée du serveur, et le flux d'entrée du client est connecté au flux de sortie du serveur.
TCP est un protocole de communication bidirectionnelle, donc les données peuvent être envoyées par deux flux de données en même temps. Voici un ensemble complet de méthodes utiles fournies par les classes pour implémenter le socket.
L'application serveur utilise la classe java.net.ServerSocket pour obtenir un port et écouter les demandes des clients.
La classe ServerSocket a quatre constructeurs :
Numéro | Description de la méthode |
1 | public ServerSocket(int port) throws IOException Créer un socket serveur lié à un port spécifique. |
2 | public ServerSocket(int port, int backlog) throws IOException Créer un socket serveur spécifié par le backlog et le lier au port local spécifié. |
3 | public ServerSocket(int port, int backlog, InetAddress address) throws IOException Créer un serveur en utilisant le port spécifié, le backlog et l'adresse IP locale à laquelle il doit être lié. |
4 | public ServerSocket() throws IOException Créez un serveur socket non lié. |
Créez un serveur socket non lié. Si le constructeur ServerSocket ne lance pas d'exception, cela signifie que votre application s'est déjà connectée avec succès au port spécifié et écoute les demandes de clients.
Voici quelques méthodes couramment utilisées de la classe ServerSocket :
Numéro | Description de la méthode |
1 | public int getLocalPort() Retourne le port sur lequel ce socket écoute. |
2 | public Socket accept() throws IOException Écoutez et acceptez la connexion à ce socket. |
3 | public void setSoTimeout(int timeout) Activez via une valeur de délai d'attente spécifiée/Désactivez SO_TIMEOUT en millisecondes. |
4 | public void bind(SocketAddress host, int backlog) Liez le ServerSocket à une adresse spécifique (adresse IP et port). |
La classe java.net.Socket représente le socket utilisé par les clients et les serveurs pour communiquer entre eux. Le client obtient un objet Socket en instanciant, tandis que le serveur obtient un objet Socket via la valeur de retour de la méthode accept().
La classe Socket a cinq constructeurs.
Numéro | Description de la méthode |
1 | public Socket(String host, int port) throws UnknownHostException, IOException. Créez un socket de flux et connectez-le au port spécifié de l'hôte. |
2 | public Socket(InetAddress host, int port) throws IOException Créez un socket de flux et connectez-le au port spécifié de l'adresse IP. |
3 | public Socket(String host, int port, InetAddress localAddress, int localPort) throws IOException. Créez un socket et connectez-le au port distant spécifié sur l'hôte distant. |
4 | public Socket(InetAddress host, int port, InetAddress localAddress, int localPort) throws IOException. Crée un socket et le connecte au port distant spécifié de l'adresse distante spécifiée. |
5 | public Socket() Crée un socket non connecté via le SocketImpl par défaut du système |
Lorsque la méthode constructeur Socket retourne, et qu'un exemple simple d'instanciation d'un objet Socket a été donné, il essaie en réalité de se connecter au serveur et au port spécifiés.
Voici une liste de méthodes intéressantes, notez que tant le client que le serveur ont un objet Socket, donc que ce soit le client ou le serveur, ils peuvent appeler ces méthodes.
Numéro | Description de la méthode |
1 | public void connect(SocketAddress host, int timeout) throws IOException Connecte ce socket au serveur et spécifie une valeur de délai d'attente. |
2 | public InetAddress getInetAddress() Retourne l'adresse connectée du socket. |
3 | public int getPort() Retourne le port distant auquel ce socket est connecté. |
4 | public int getLocalPort() Retourne le port local auquel ce socket est lié. |
5 | public SocketAddress getRemoteSocketAddress() Retourne l'adresse de l'extrémité de connexion du socket, ou null si non connecté. |
6 | public InputStream getInputStream() throws IOException Retourne le flux d'entrée de ce socket. |
7 | public OutputStream getOutputStream() throws IOException Retourne le flux de sortie de ce socket. |
8 | public void close() throws IOException Ferme ce socket. |
Cette classe représente une adresse IP (IP) Internet. Voici une liste des méthodes utiles pour la programmation Socket :
Numéro | Description de la méthode |
1 | static InetAddress getByAddress(byte[] addr) Dans le cas d'une adresse IP originale donnée, retourne l'objet InetAddress. |
2 | static InetAddress getByAddress(String host, byte[] addr) Crée InetAddress en fonction du nom d'hôte et de l'adresse IP fournis. |
3 | static InetAddress getByName(String host) Détermine l'adresse IP de l'hôte pour un nom d'hôte donné. |
4 | String getHostAddress() Renvoie une chaîne d'adresse IP (représentée sous forme de texte). |
5 | String getHostName() Obtient le nom d'hôte de cette adresse IP. |
6 | static InetAddress getLocalHost() Renvoie l'hôte local. |
7 | String toString() Convertir cette adresse IP en String. |
Le GreetingClient suivant est un programme client, qui se connecte au serveur via socket pour envoyer une requête et attend une réponse.
// Nom du fichier 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("Connexion à l'hôte : "} + serverName + ", le port : "} + port); Socket client = new Socket(serverName, port); System.out.println("远程主机地址:" + client.getRemoteSocketAddress()); OutputStream outToServer = client.getOutputStream(); DataOutputStream out = new DataOutputStream(outToServer); out.writeUTF("Bonjour de "} + client.getLocalSocketAddress()); InputStream inFromServer = client.getInputStream(); DataInputStream in = new DataInputStream(inFromServer); System.out.println("Réponse du serveur : "} + in.readUTF()); client.close(); catch(IOException e) { e.printStackTrace(); } } }
以下 GreetingServer 程序是一个服务器端应用程序,使用 Socket 来监听一个指定的端口。
// 文件名 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("等待远程连接,端口号为:" + serverSocket.getLocalPort() + "..."); Socket server = serverSocket.accept(); System.out.println("远程主机地址:" + server.getRemoteSocketAddress()); DataInputStream in = new DataInputStream(server.getInputStream()); System.out.println(in.readUTF()); DataOutputStream out = new DataOutputStream(server.getOutputStream()); out.writeUTF("谢谢连接我:" + 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.run(); catch(IOException e) { e.printStackTrace(); } } }
Compile the above two java files and execute the following command to start the service, using port 6066:
$ javac GreetingServer.java $ java GreetingServer 6066 Waiting for remote connection, port:6066...
Open a new command window and execute the following commands to start the client:
$ javac GreetingClient.java $ java GreetingClient localhost 6066 Connecting to host: localhost, port:6066 Remote host address: localhost/127.0.0.1:6066 Server response: Thank you for connecting to me:/127.0.0.1:6066 Goodbye!