prosty komunikator

0

Piszę prosty komunikator TCP w javie. Serwer jest wielowątkowy. Każdy klient łączy się z serwerem a ten tworzy dla niego nowy wątek i otwiera strumienie we/wy. Chciałbym aby klient1 wysyłał obiekt z wiadomością do serwera, ten odczytuje pole ip odbiorcy i przesyła do klienta2. Problem polega na komunikacji między dwoma osobnymi wątkami serwera reprezentującymi odpowiednie połączenia z klientem. (Klient1 <--> wątek Serw1 <--> watek Serw2 <-->klient2.
Może zna ktoś jakiś inny sposób komunikacji między dwoma klientami poprzez serwer wielowątkowy?

Kod serwera

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

public class Serwer
{
    
    public static void main(String[] args) 
    {
        ServerSocket serverSocket = null;
        boolean listening = true;

        try
        {
            serverSocket = new ServerSocket(4444);
        
			
        while (listening)
	    	new ServerThread(serverSocket.accept()).start();
		
        serverSocket.close();
        
        }
        catch (IOException e)
        {
            System.err.println("Could not listen on port: 4444.");
            System.exit(-1);
        }
    }
}

Wątek serwera:

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

public class ServerThread extends Thread
{
    private Socket socket = null;
	private Wiadomosc wiad;
	private ObjectInputStream in=null;
    
    public ServerThread(Socket socket)
    {
		super("ServerThread");
		this.socket = socket;
    }

    public void run()
    {
		try 
		{
			in = new ObjectInputStream(new BufferedInputStream(socket.getInputStream()));

	    	String inputLine, outputLine;

	    	while ((wiad =(Wiadomosc)in.readObject()) != null)
	    	{  
	   			if (wiad.tresc.equals("Bye"))
	    			break;
	    		System.out.println ("Wiadomosc: ID= "+wiad.id+" Tresc= "+wiad.tresc);
	  		}
	    
	    	in.close();
	    	socket.close();

		}
		catch (IOException e)
		{
		    e.printStackTrace();
		}
		catch(ClassNotFoundException z)
		{
			System.out.println("Nie znaleziono klasy");
		}	
    }
}
0

Trzeba by stworzyc kontroler, zarzadzajacy polaczonymi klientami. Taki obiekt (dispatcher) posiadalby liste klientow, np. mapa hashujaca z unikalnym ID uzytkownika jako kluczem, ktorzy w danym momencie sa dostepni oraz obiekt watku serwera, dla polaczenia. Dodatkowo, taki dispatcher moglby implementowac mechanizm nasluchiwania (np. MessageListener) nadejscia nowej wiadomosci i kierowac ja do odpowiedniego strumienia (na podstwie ID uzytkownika, zawartym w pseudo-protokole wiadomosci). Np.

interface MessageListener {
	void messageArrived(Message msg);
}

class Message {
	private String senderId;
	private String receiverId;
	private Object data;
	// getters, setters, itd.
}

class MessageDispacher implements MessageListener {
	private Hashtable<String, ServerThread> activeClients;
	
	public void messageArrived(Message msg) {
		ServerThread client = activeClients.get(msg.getReceiverId());
		if(client != null) {
			client.sendMessage(msg); // metoda zaimplementowana w ServerThread 
		}
	}
	// reszta flakow
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1