[TCP] Pytanie o serwer obsługujący wielu klientów naraz.

0

Witam,
mam pytanie odnośnie serwera TCP. Mianowicie analizując przykład z książki "Java - Techniki zaawansowane" Natrafiłem na przykład serwera TCP do którego może się podłączyć więcej niż jeden klient naraz. Moje pytanie brzmi: Dlaczego jeśli otworzę dwa okna Telnetu i na obu połączę się z tym serwerem to wynik jest zwracany tylko w oknie w którym podałem tekst?
Ponadto chciałbym się zapytać czy możnaby poprawić ten kod w ten sposób aby tekst podany przez jednego klienta, był widoczny dla wszystkich (bez konieczności rozróżniania przez kogo został on napisany).

Poniżej zamieszczam kod:

Klasa TCPHandler:

< code = java >
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

public class TCPHandler implements Runnable{

private Socket incoming;

public TCPHandler(Socket i)
{
    this.incoming = i;
}

public void run()
{
    try
    {
        try
        {
            InputStream inStream = incoming.getInputStream();
            OutputStream outStream = incoming.getOutputStream();

            Scanner in = new Scanner(inStream);
            PrintWriter out = new PrintWriter(outStream, true);

            out.println("Hello! --- BYE to exit");

            boolean done  = false;

            while(!done && in.hasNextLine())
            {
                String line = in.nextLine();
                out.println("Echo: "+line);

                if(line.trim().equals("bye".toUpperCase())){
                    done = true;
                }
            }

        }
        finally{
            incoming.close();
        }
    }
    catch(IOException e){}
}

}

< / code >

Oraz klasa TCPTalkTest:

< code = java >
import java.net.ServerSocket;
import java.net.Socket;

public class TCPTalkTest {
public static void main(String []args)
{
try
{
ServerSocket s = new ServerSocket(8189);

        while(true)
        {
            Socket incoming = s.accept();
            Runnable r = new TCPHandler(incoming);
            Thread t = new Thread(r);
            t.start();
        }
    }
    catch(Exception e){}      
}

}

< / code >

Z góry dzięki za każdą pomoc wskazówkę :)
Pozdrawiam,

0
trox napisał(a)

Dlaczego jeśli otworzę dwa okna Telnetu i na obu połączę się z tym serwerem to wynik jest zwracany tylko w oknie w którym podałem tekst?

Poniewaz tak zostal napisany Twoj TCPHandler.

trox napisał(a)

Ponadto chciałbym się zapytać czy możnaby poprawić ten kod w ten sposób aby tekst podany przez jednego klienta, był widoczny dla wszystkich (bez konieczności rozróżniania przez kogo został on napisany).

Tak.

Przykladowe zalozenia projektowe:

  1. Serwer przechowuje liste aktywnych watkow klienckich (obiektow typu TCPHandler)
    a) kazdy nowo rozpoczety watek (polaczony klient) dodawany jest do listy
    b) lista przegladana jest cyklicznie w celu usuniecia nieaktywnych watkow (tj. TCPHandler, ktory zakonczyl dzialanie)
  2. Serwer przechowuje wszystkie otrzymane wiadomosci w postaci kolejki
  3. Istnieje dodatkowy watek, np. MessageDispatcher, ktory nasluchuje zmian w kolejce i gdy nowa wiadomosc sie pojawi, powiela ja do wszystkich aktywnych klientow
    a) watek ten moglby jednoczesnie odpowiadac za czyszczenie listy klientow z nieaktywnych polaczen
  4. TCPHandler
    a) wstawia otrzymane wiadomosci do kolejki na serwerze i powiadamia MessageDispatcher
    b) udostepnia watkowi MessageDispatcher mozliwosc przekazania wiadomosci (np. metoda: TCPHandler.sendMessage(String message)) i wysyla ja do klienta

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