Aplikacja klient-serwer gnizda wątki

0

Tworzę sobie wątek serwera i go odpalam (ServerSocket) serwer w pętli while akceptuje połączenia klientów i tworzy im nowe osobne wątki. Te wątki w swojęj pętelce pobierają String'i i wysyłają je do nadawcy (takie echo). No i problem jest taki wszystko ładnie działa ale procesor wariuje jak głupi bo wątek obsługi klienta ciągle sprawdza bufor odbiorczy. Czy ma ktoś jakiś pomysł?
Drugie pytanko czy można jakoś sprawdzić bufor oczekujących klientów na połączenie bo gdy użyję accept wątek serwera zawiesza się aż do momentu nawiązania połączenia. Chciałbym żeby łączył tylko gdy ktoś jest w kolejce.

0

Jesli chodiz o bufor to moze spróboj to rozwiazać dodając monitor/semafor do tego zasobu.

0

Albo chociaz małego sleepa? w końcu chyba wystarczy jakby sprawdził raz na sekundę czy ktoś nowy nie chce się podłączyć? Ale nie wiem czy to przejdzie bo jeszcze nie robiłem takiego serwera (ale już niedługo, hehe).

0

akceptuj polaczenia w osobnym przeznaczonym do tego watku. wtedy nie bedzie mialo znaczenia czy jest blokowany, czy nie. stworz 3 rodzaje watkow: 1) program glowny 2) watek akceptujacy polaczenia 3) watki obslugujace polaczenia.nie znam javy, wiec nie powiem ci , czy jest mozliwosc sprawdzenia kolejki oczekujacych polaczen (w socketach w pisiksowym c jest - funkcja select() ), ani czy jest mozliwosc przelaczenia socketa w tryb nieblokujacy (w socketach c ... ;] - fcntl() ).

0

Sproboj tak... Zadeklaruj sobie taka zmienna
ServerSocket server;
potemi umiesc cos takiego w petli:

Socket client = server.accept();
Thread t = new MojaKlasa (client);
t.start();

Teraz obciazenie procka wyniesie 0, bo czekasz tylko (a nie sprawdzasz) i jak cos sie pojawi to wtedy dopiero tworzysz dla danego polaczenia gniazdko i w klasie MojaKlasa ktora musi dziedziczyc po Thread robisz sobie co dusza zapragnie :]

class MojaKlasa extends Thread
{
        private Socket myclient = null;
        public MojaKlasa (Socket s)
        {
                myclient = s;
        }
        
        public void run()
        {
               //tu robisz swoje
        }
}

Sprawdzone, przetestowane setki razy. Dziala 100% skutecznie

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