Préambule

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.

Exercice 1

NB : cet exercice est un simple tutoriel permettant de voir une application client/serveur simple en Java

import 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());
	}
    }
}
import 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());
	}
    }
}

Exercice 2

Remarques :

Exercice 3