Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    piccololo problemino con socket

    Ciao ragazzi

    prendendo spunto qui sul forum ho creato un server multithread, funziona correttamente però vorrei far sì che se il CLIENT A scriva "ciao" anche gli altri CLIENT dovranno visualizzare ciò che scrive il CLIENT A e viceversa per tutti i client connessi.
    (Poichè attualmente se il CLIENT A scrive "ciao" solo lui potrà visionare ciò che scrive)

    Leggendo un pò di post nella rete credo che dovrei inserire un Ciclo FOR per fare in modo che gli utenti possano leggere cioè che gli altri scrivano ma siccome non ho ancora tutta questa dimistichezza in JAVA vorrei ser qualche anima pia mi dica come fare..perchè è l'ultima cosa che mi manca e mi sono davvero bloccato..

    GRAZIE


    codice:
    //Importo i package
    import java.net.*;
    import java.io.*;
    
    //Creazione di una classe per il Multrithreading
    class ServerThread extends Thread
    {
    	private Socket socket;
    	public ServerThread(Socket socket)
    	{
    		this.socket = socket;
    	}
    
    	//esecuzione del Thread sul Socket
    	public void run()
    	{
    		// Message terminator
    		char EOF = (char)0x00;
    
    		try
    		{
    
    			BufferedReader data_in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    			PrintWriter data_out = new PrintWriter(socket.getOutputStream());
    
    			data_out.println("Welcome! type EXIT to quit." + EOF);
    			data_out.flush();
    
    			boolean quit = false;
    
    			while (!quit)
    			{
    				String msg = data_in.readLine();
    
    				if (msg == null)
    				{
    					quit = true; 
                    }
    
    				else if (msg.trim().equals("EXIT"))
    				{
    					quit = true;
    
    				}
    
    				else
    				{
    					data_out.println("You sayed: " + msg.trim() + "" + EOF);
    					data_out.flush();
    				}
    
    				//QUI DOVREI FAR LEGGERE I MESSAGGI A TUTTI I CLIENT - MA COME IMPOSTO LA COSA?
    
    		
    			}
    			data_in.close();
    			data_out.close();
    
    			System.out.println("Ho ricevuto una chiamata di chiusura da:\n" + socket + "\n" + EOF);
    			socket.close();
    		}
    		catch (IOException e)
    		{
    			System.out.println("Connection lost");
    		}
    	}
    }
    
    //Classe Server per attivare la Socket
    public class TCPParallelServer
    {
    	public void start() throws Exception
    	{
    		ServerSocket serverSocket = new ServerSocket(2055);
    
    		//Ciclo infinito di ascolto dei Client
    		while (true)
    		{
    			System.out.println("Connessione al Server su porta: 2055");
    			Socket socket = serverSocket.accept();
    			System.out.println("Ho ricevuto una chiamata di apertura da:\n" + socket);
    			ServerThread serverThread = new ServerThread(socket);
    			serverThread.start();
    		}
    	}
    
    	public static void main(String[] args)  throws Exception
    	{
    		TCPParallelServer tcpServer = new TCPParallelServer();
    		tcpServer.start();
    	}
    }

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Con la struttura che hai non lo puoi fare agevolmente: ad ogni connessione che arriva al server, istanzi correttamente un thread che gestisce la connessione... ma questo thread non lo memorizzi da nessuna parte.

    Dovrai aggiungere alla classe TCPParallelServer una struttura dati che possa contenere tutte le istanze di thread create (banale: ti basta un ArrayList). Ad ogni connessione, avvii un thread e lo aggiungi a questo array list.

    Poi, quando arriva un messaggio, il thread lo riceve e, tutto ciò che dovrà fare, sarà chiamare un metodo del server che farà un ciclo for su tutto l'ArrayList. Per ciascuno dei thread presenti, chiamerà il metodo per inviare il messaggio a tutti (che dovrai implementare...). In pratica, dovrai spostare le istruzioni

    codice:
    data_out.println("You sayed: " + msg.trim() + "" + EOF);
    data_out.flush();
    all'interno di un metodo pubblico sempre all'interno di quella classe. Dove prima eseguivi quelle due istruzioni, adesso richiamerai un metodo della classe TCPParallelServer... sarà quest'ultima che invocherà il nuovo metodo pubblico per effettuare l'invio del messaggio a tutti.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Grazie mille LeleFT sei stato gentilissimo, adesso ci provo e ti faccio sapere..

    grazie

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.