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ść.

0

Poszedlem juz troche dalej z tym problemem ale potrzebuje jeszcze malej pomocy
Taki oto kod opowiada za polaczenie i przesylanie i odbieranie danych miedzy klientem a serwerem. Jest to program do rozwiazywania testow.

 
        public void gniazdo()
        {

            sock.Bind(iep);

            Thread watatek = new Thread(new ThreadStart(polaczenie));
            watatek.IsBackground = true;
            watatek.Start();



        }

        private void polaczenie()
        {

            while (true)
            {
                try
                {
                    EndPoint ep = (EndPoint)iep;
                    byte[] data = new byte[4*liczba];
                    int recv = sock.ReceiveFrom(data, ref ep);
                    
                    stringData = Encoding.ASCII.GetString(data, 0, recv);
                    nr_komputera = stringData;
                    
                    recv = sock.ReceiveFrom(data, ref ep);
                    stringData = Encoding.UTF8.GetString(data, 0, recv);
                    imie_nazwisko = stringData;

                    recv = sock.ReceiveFrom(data, ref ep);
                    stringData = Encoding.ASCII.GetString(data, 0, recv);
                    indeks = stringData;
                    double nr_komputera2 = 0;
                    nr_komputera2 = double.Parse(nr_komputera);
                    
                    data = null;
                    
                    //StreamReader do_wyslania;
                    if (nr_komputera2 % 2 == 0) { do_wyslania = new StreamReader(textBox4.Text); } else { do_wyslania = new StreamReader(textBox2.Text); }
                    
                    string wysi = do_wyslania.ReadToEnd();
                    
                    do_wyslania = null;
                    data = Encoding.UTF8.GetBytes(wysi);

                    sock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);
                    sock.SendTo(data, ep);

                    if (nr_komputera2 % 2 == 0) { do_wyslania = new StreamReader(textBox3.Text); } else { do_wyslania = new StreamReader(textBox5.Text); }
                    wysi = do_wyslania.ReadToEnd();

                    data = Encoding.ASCII.GetBytes(wysi);
                    sock.SendTo(data, ep);
                   
                
                    recv = sock.ReceiveFrom(data, ref ep);
                    stringData = Encoding.UTF8.GetString(data, 0, recv);
                    liczba_punktow = stringData;
                    

Wszystko idzie ok do momentu oczekiwania na to az klient prześle wyniki, ale zeby mogl przeslac wyniki musi rozwiazać test wiec watek oczekuje a w tym momecie nie moze podlaczyc sie inny klient. Ktos wie jak to rozwiazac?

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