
Le terme programmation réseau se réfère à des programmes qui s'exécutent sur plusieurs appareils (ordinateurs), dans lesquels les périphériques sont tous connectés l'un à l'autre à l'aide d'un réseau.
Le paquetage java.net des API J2SE contient une collection de classes et d'interfaces qui fournissent les détails de communication de bas niveau, ce qui vous permet d'écrire des programmes axés sur la résolution du problème.
Le paquetage java.net fournit un support pour les deux protocoles réseau communs:
Cette partie donne une bonne compréhension sur les deux sujets suivants:
Les sockets fournissent le mécanisme de communication entre deux ordinateurs utilisant TCP. Un programme client crée un socket à la fin de la communication et tente de connecter ce socket à un serveur.
Lorsque la connexion est établie, le serveur crée un objet socket à la fin 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:
Une fois les connexions établies, la communication peut se produire en utilisant des flux d'E/S. Chaque socket possède un OutputStream et un InputStream. Le OutputStream du client est connecté au InputStream du serveur et le InputStream du client est connecté au OutputStream du serveur.
TCP est un protocole de communication twoway, de sorte que les données peuvent être envoyées à travers les deux flux en même temps. Il existe des classes utiles fournissant un ensemble complet de méthodes pour implémenter des sockets.
La classe java.net.ServerSocket est utilisée par les applications serveur pour obtenir un port et écouter les demandes des clients
La classe ServerSocket comporte quatre constructeurs:
SN |
Méthodes avec description |
1 |
public ServerSocket(int port) throws IOException Essayer de créer une socket de serveur liée au port spécifié. Une exception se produit si le port est déjà lié par une autre application. |
2 |
public ServerSocket(int port, int backlog) throws IOException |
3 |
public ServerSocket(int port, int backlog, InetAddress address) throws IOException |
4 |
public ServerSocket() throws IOException |
Si le constructeur de ServerSocket ne lance pas d'exception, cela signifie que votre application a été liée avec succès au port spécifié et est prête pour les demandes des clients.
Voici quelques-unes des méthodes courantes de la classe ServerSocket :
SN |
Méthodes avec description |
1 |
public int getLocalPort() |
2 |
public Socket accept() throws IOException |
3 |
public void setSoTimeout(int timeout) |
4 |
public void bind(SocketAddress host, int backlog) |
Lorsque le ServerSocket invoque accept( ), la méthode ne revient pas jusqu'à la connexion d'un client. Une fois que le client se connecte, ServerSocket crée un nouveau Socket sur un port non spécifié et renvoie une référence à cette nouvelle Socket. Une connexion TCP existe maintenant entre le client et le serveur, et la communication peut commencer.
La classe java.net.Socket représente le socket que le client et le serveur utilisent pour communiquer entre eux. Le client obtient un objet Socket en l'instanciant, tandis que le serveur obtient un objet Socket à partir de la valeur de retour de la méthode accept( ).
La classe Socket comporte cinq constructeurs qu'un client utilise pour se connecter à un serveur:
SN |
Méthodes avec description |
1 |
public Socket(String host, int port) throws UnknownHostException, IOException. |
2 |
public Socket(InetAddress host, int port) throws IOException |
3 |
public Socket(String host, int port, InetAddress localAddress, int localPort) throws IOException. |
4 |
public Socket(InetAddress host, int port, InetAddress localAddress, int localPort) throws IOException. |
5 |
public Socket() |
Lorsque le constructeur Socket retourne, il ne crée pas simplement d'instanciation d'un objet Socket mais tente de se connecter au serveur et au port spécifiés.
Certaines méthodes d'intérêt dans la classe Socket sont listées ici. Notez que le client et le serveur ont un objet Socket, de sorte que ces méthodes peuvent être invoquées par le client et le serveur.
SN |
Méthodes avec description |
1 |
public void connect(SocketAddress host, int timeout) throws IOException |
2 |
public InetAddress getInetAddress() |
3 |
public int getPort() |
4 |
public int getLocalPort() |
5 |
public SocketAddress getRemoteSocketAddress() |
6 |
public InputStream getInputStream() throws IOException |
7 |
public OutputStream getOutputStream() throws IOException |
8 |
public void close() throws IOException |
Cette classe représente une adresse Internet(IP). Voici les méthodes utiles dont vous auriez besoin lors de la programmation socket:
SN |
Méthodes avec description |
1 |
static InetAddress getByAddress(byte[] addr) |
2 |
static InetAddress getByAddress(String host, byte[] addr) |
3 |
static InetAddress getByName(String host) |
4 |
String getHostAddress() |
5 |
String getHostName() |
6 |
static InetAddress getLocalHost() |
7 |
String toString() |
Le GreetingClient suivant est un programme client qui se connecte à un serveur en utilisant un socket et envoie un message d'accueil, puis attend une réponse.
//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();
}
}
}
Le programme GreetingServer suivant est un exemple d'une 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:
//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();
}
}
}
Compile le client et le serveur, puis lancez le serveur comme suit:
java GreetingServer 6066
Waiting for client on port 6066...
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!