La communication entre deux objets connectés ou bien entre un objet et un serveur passe forcément par des protocoles proches du matériel, tels que le bluetooth, wifi, ethernet, ou un peu au-dessus IP/TCP. Bien entendu, cette utilisation peut être masquée par l'utilisation de protocoles de niveau applicatifs qui s'appuient sur ces derniers, comme quand par exemple un capteur avec wifi envoie son résultat à un serveur web via HTTP. Un des avantages de ces protocoles est qu'ils sont généralement utilisables dans bons nombres d'objets connectés fonctionnant avec un minimum de système d'exploitation (comme avec un raspberry), ou disons de fonctionnalités similaires (comme avec un arduino).
Ce TP est l'occasion de se familiariser avec TCP, l'établissement d'une connexion et la communication entre deux applications Java. Pour faire ces exercices, pas besoin de s'encombrer d'un raspberry : un seul ordinateur suffit.
NB : cet exercice est un simple tutoriel permettant de voir une application client/serveur simple en Java
EchoServer.javaimport java.io.*;
import java.net.*;
class EchoServer {
public static void main(String []args) {
BufferedReader br = null; // pour lire du texte sur la socket
PrintStream ps = null; // pour envoyer du texte sur la socket
String line = null; // la ligne reçu/envoyée
ServerSocket conn = null;
Socket sock = null;
int port = -1;
if (args.length != 1) {
System.out.println("usage: Server port");
System.exit(1);
}
try {
port = Integer.parseInt(args[0]); // récupération du port sous forme int
conn = new ServerSocket(port); // création socket serveur
}
catch(IOException e) {
System.out.println("problème création socket serveur : "+e.getMessage());
System.exit(1);
}
try {
sock = conn.accept(); // attente connexion client
br = new BufferedReader(new InputStreamReader(sock.getInputStream())); // creation flux lecture lignes de textes
ps = new PrintStream(sock.getOutputStream()); // création flux écriture lignes de texte
line = br.readLine(); // réception d'une ligne
System.out.println("le client me dit : "+line); // affichage debug
ps.println(line); // envoi de la ligne précédemmetn reçue
br.close();
ps.close();
}
catch(IOException e) {
System.out.println(e.getMessage());
}
}
}
BufferedReader et un PrintStream grâce à la socket de communication obtenue,EchoClient.javaimport java.io.*;
import java.net.*;
class EchoClient {
public static void main(String []args) {
BufferedReader br = null; // pour lire du texte sur la socket
PrintStream ps = null; // pour écrire du texte sur la socket
String line = null;
Socket sock = null;
int port = -1;
if (args.length != 3) {
System.out.println("usage: EchoClient ip_server port message");
System.exit(1);
}
try {
port = Integer.parseInt(args[1]); // récupération du port sous forme int
sock = new Socket(args[0],port); // création socket client et connexion au serveur donné en args[0]
}
catch(IOException e) {
System.out.println("problème de connexion au serveur : "+e.getMessage());
System.exit(1);
}
try {
br = new BufferedReader(new InputStreamReader(sock.getInputStream())); // création flux lecture lignes de texte
ps = new PrintStream(sock.getOutputStream()); // création flux écriture lignes de texte
ps.println(args[2]); // envoi du texte donné en args[2] au serveur
line = br.readLine(); // lecture réponse serveur
System.out.println("le serveur me repond : "+line); // affichage debug
br.close();
ps.close();
}
catch(IOException e) {
System.out.println(e.getMessage());
}
}
}
BufferedReader et un PrintStream, grâce à la socket de communication,javac EchoClient.java et javac EchoServer.java)java EchoServer 12345localhost, le même port et un message : java EchoClient localhost 12345 "bonjour ca va?"EchoServer afin que le serveur puisse répondre à un nombre potentiellement infini de clients successifs (= tant que l'on arrête pas le serveur).