Dopo aver visto un semplice esempio di una socket in java, vedremo come implementare il server in modo da poter accettare e gestire più connessioni contemporaneamente servendoci dei Thread, destinando appunto la gestione di ogni singola richiesta di connessione ad un thread diverso.

Nel codice del seguente esempio utilizzeremo i thread solo per servirci del nostro scopo, cioè gestire più connessioni contemporaneamente da parte della socket server, per avere una panoramica completa sui thread in java consiglio la lettura di questo pdf.

Il server non fa altro che ciclare all’infinito in attesa di connessioni; ogni volta che riceve una nuova richiesta di connessione da parte di un client, genera un thread che si occuperà di quella specifica richiesta, si rimetterà in attesa di un’altra richiesta e ripeterà l’operazione:

import java.net.*;
import java.io.*;

public class server
{
	public static void main(String args[])
	{
		try
		{
			ServerSocket server = new ServerSocket(33333);

			// ciclo infinito, in attesa di connessioni
			while(true)
			{
				// chiamata bloccante, in attesa di una nuova connessione
				Socket client = server.accept();

				// la nuova richiesta viene gestita da un thread indipendente, si ripete il ciclo
				connect nuovaConnessione = new connect(client);
			}
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
	}
}

La classe seguente definisce il thread che andrà a gestire separatamente le singole connessioni, come si evince dal codice è possibile rimandare a questa classe la dichiarazione e l’inizializzazione degli eventuali buffer in ingresso e uscita.

class connect extends Thread
{
	// dichiarazione delle variabili socket e dei buffer
	Socket client;
	BufferedReader in;
	PrintWriter out;

	public connect(Socket client)
	{
		this.client = client;

		// invoca automaticamente il metodo run()
		this.start();
	}

	public void run()
	{
		try
		{
			// inizializza i buffer in entrata e uscita
			in = new BufferedReader(new InputStreamReader(client.getInputStream()));
			out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(client.getOutputStream())), true);


			System.out.println("Sto servendo il client che ha indirizzo "+client.getInetAddress());

			// eventuali elaborazioni e scambi di informazioni con il client

			// ...

			// chiusura dei buffer e del socket
			in.close();
 			out.close();
 			client.close();
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
	}
}

Il thread si chiuderà automaticamente non appena il metodo run() terminerà la sua esecuzione.

About OpenProgrammers

Programmatore per passione. Mi piace condividere qualsiasi idea o informazione utile, per questo motivo ho realizzato il blog.