Watki aplikacja klient-serwer

0

Witam, mam taki problem zrobilem aplikacj klient-serwer wszystko ladnie dziala oprocz jednej rzeczy nie może w jednej chwili podłączyć się do serwera więcej niż jeden użytkownik.
Watki rozwiazalem w taki sposob:

Thread watek_nasuchiwanie = new Thread(new ThreadStart(nasluchiwanie));
watek_nasuchiwanie.Start();
   private void nasluchiwanie()
        {
            sock.Bind(iep);
            Thread watatek = new Thread(new ThreadStart(polaczenie));

            watatek.IsBackground = true;
     
            watatek.Start();
        }
 

Ktoś wie co może być źle?

0

Jak masz jeden wątek do nasłuchiwania to nie możesz obsługiwać w jednym czasie wielu klientów, muszą iść po kolei -> akceptujesz jednego, wykonujesz coś tam na nim, potem drugi itd.

0

To jak zrobić żeby serwer cały czas nasłuchiwał i w momencie kiedy bedzie nowy klient w nowym watku cos tam z nim robił? i tak w kolko az do zakonczenia nasluchiwania?

0

Nie rozumiem do końca o co ci chodzi. Ja właśnie jestem w trakcie pisania komunikatora i ja robię tak:
(nie chce mi się kodu wklejać więc tak opiszę)
W wątku nasłuchującym pętla nieskończona. W niej pętla, która sprawdza czy nie ma połączeń oczekujących (pending), jeżeli tak to pętla się przerywa i podłączam klienta i robię sobie z nim tam co chcę. Następnie pętla dobiega końca (wcześniej uruchamiam obsługę tego klienta). Potem następne kółko pętli dla następnego klienta, o ile takowy jest.

Może chodzi ci o to, żeby w jednym momencie przyłączyć 2 klienty? Tak się nie da. Musi być tylko jedno połączanie oczekujące. Może i jakoś się tam da, ale wiadomo jest duużo grzebania i takie tam. Nie jestem specem o socket'ów.

0

No mi wlasnie chodzi o to aby w jednym momencie moglo podlaczyc sie przynajmniej dwoch klientow.

0

No to tylko od siebie mogę powiedzieć, że takiej możliwości nie ma, jeden listener = jeden oczekujący klient. I wątpię, żeby coś się z tym dało zrobić. Co najwyżej 2 listener'y działające w ten sam sposób.

0

Musisz w pętli stworzyć nowego socketa i nowy wątek i kiedy klient się łączy to właśnie tworzy nowe połączenie itd.
Nie wiem jak to jest w C# ale w javie właśnie tak się to robi.
Uruchamia się w ten sposób nowy wątek do obsługi połączenia z nowym klientem.

 public static void main(String[] args )
   {  
      try
      {  
         int i = 1;
         ServerSocket s = new ServerSocket(8888);

         while (true)
         {  
            Socket incoming = s.accept();
            System.out.println("Spawning " + i);
            Runnable r = new Coś_co_implementuje_interfejs_Runnable(incoming); // a w nim metoda run() obsługująca wejście-wyjście
            Thread t = new Thread(r);
            t.start();
            i++;
         }
      }
      catch (IOException e)
      {  
         e.printStackTrace();
      }
   }
0

Dzieki za dotychczasową pomoc. Juz wiem o co biega, tylko jak zakceptować klienta jeżeli serwer wykorzystuje połącznie UDP, bo metoda Accept wymaga wykorzystania Listen a ta metoda nie jest dostepna dla protokołu UDP. Oglnie robie cos w rodzaju programu do rozwiazywania testow i test rozsyla serwer do klientow i dlatego potrzebne mi jest podlaczenie klientow w jednym czasie.

Nikt nie ma żadnego pomysłu?

0

A dlaczego nie TCP?
I czy nie masz jakiejś metody w stylu getInputStream() ?

0

Dlatego Udp bo program musi rozsylac swoj adres brodcastowo a z tego co wiem tylko UDP ma taka mozliwość.

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