Creare una comunicazione usando i socket
L'aspetto importante dell'informatica è sicuramente lo scambio di informazioni, perchè un computer che non ha la possibilità di ricevere e di mandare dati è come se teniamo il nostro computer chiuso in una scatola. Una delle tecniche tra le più usate nell'ambito della rete è la comunicazione via socket che si trova nel livello 4 del modello ISO/OSI.
Il socket lavora usando principalmente 2 fondamentali protocolli:
- UDP User Datagram Protocol
- TCP Transfer Control Protocol
Nel nostro esempio useremo il protocollo TCP perchè punteremo alla affidabilità per scambiare i messaggi, alla creazione del socket che farà da server dobbiamo dire quale sarà l'indirizzo e quale sarà la porta.
server.php:
$indirizzo = "127.0.0.1"; $porta = "20000"; // rimuovo il timeout set_time_limit(0); // creazione $sock = socket_create(AF_INET, SOCK_STREAM, 0) or die("Errore creazione\n". .socket_strerror(socket_last_error())); // bind alla porta $result = socket_bind($sock, $indirizzo, $porta) or die("Errore bind\n" . .socket_strerror(socket_last_error())); // metto in ascolto $result = socket_listen($sock, 3) or die("Errore ascolto\n" .socket_strerror(socket_last_error())); while(true){ // accetto la connessione $client = socket_accept($sock) or die("Could not accept incoming connection\n"); // input del client $input = socket_read($client, 1024) or die("Errore input\n" .socket_strerror(socket_last_error())); $input = trim($input); socket_getpeername($client , $address , $port); echo $address.":".$port."=".$input."\n"; $output = "ricevuto\n"; socket_write($client, $output) or die("Errore output\n".socket_strerror(socket_last_error())); socket_close($client); } socket_close($sock);
client.java:
import java.io.*; import java.net.*; public class Client extends Thread { private static String msg; private boolean avvia; private String result; public Client(String msg){ // prendo il messaggio this.msg = msg + "\n"; System.out.println(msg); avvia = false; result = ""; } @Override public void run(){ String hostName = "127.0.0.1"; int portNumber = Integer.parseInt("20000"); String rcv; if(avvia){ try { // apro una connessione con il server Socket server = new Socket(hostName, portNumber); // acquisisco lo stream di output PrintWriter out = new PrintWriter(server.getOutputStream(), true); // invio il messaggio out.println(msg); // acquisisco lo stream di input BufferedReader in = new BufferedReader( new InputStreamReader(server.getInputStream())); // Aspetto la risposta // il metodo readLine() blocca l'esecuzione // del thread fino alla ricevuta // della risposta dal server result = in.readLine(); server.close(); }catch(UnknownHostException e) { System.out.println("host sconosciuto: " + hostName); System.exit(-1); }catch(IOException e) { System.out.println("No I/O"); System.exit(-1); } avvia = false; } } public String invia(){ avvia = true; try{ join(); }catch(Exception e){ e.printStackTrace(); } return result; } public static void main(String[] args){ Client c = new Client("Ciao Mondo"); c.start(); System.out.println(c.invia()); } }