[klient+serwer] Problem z efektywnościa

0

Witam

Mam problem z efektywnością mojego programu. Ogólny zarys funkcjonalności programu jest taki, że klient żąda od serwera żeby ten wykonał jakieś zadanie, a serwer po wykonaniu zadania przesyła wynik do klienta. Poniżej sa kody dla klienta i serwera, w których tkwi problem (tak sądzę). Chodzi o to, że jeżeli w liście wynikowej, której elementy ma przesłać serwer jest więcej elementów niż 8 to klient ich nie odbiera, mimo że serwer przesyła je do strumienia.

Nie wiem dokładnie dlaczego klient się blokuje (Serwer działa nadal). W kodzie serwera są zakomentowane instrukcje, jeżeli je odkomentuje to załatwiają problem tylko częściowo - klient nadąża z pobieraniem wyniku, ale usypianie znacznie wydłuża czas w porównaniu do czasu w jakim serwer przesyła wynik. Ustawienie mniejszego czasu też powoduje blokadę.

Jeżeli ktoś ma jakiś pomysł na rozwiązanie tego problemu, to bedę wdzięczny za pomoc

serwer - przesyłanie wyniku do klienta

...
ObjectOutputStream outStream = new ObjectOutputStream(clientSocket.getOutputStream());
Result result;
//przesyłanie po kolei wyników zawartych w liście
for (int i = 0; i < resultArray.size(); i++)
{
    outStream.writeObject(resultArray.get(i));
    //if (i % 8 == 0)
    //  Thread.sleep(200);
}               
result = new Result(-1, "end");
outStream.writeObject(result);
...

klient - odbiór wyniku

...
ObjectInputStream inStream = new ObjectInputStream(socket.getInputStream());
boolean continueReading = true;
while (continueReading)
{           
      //odebranie kolejnej porcji wyniku
      Result result = (Result) inStream.readObject();

      //koniec wysyłania określony jest przez odebranie spreparowanego wyniku
      //w którym wartość pola określającego numer znaku jest równa -1
      if(result._absolutePosition == -1)
        continueReading = false;
       //jeżeli odebrano zwykły wynik dodawany jest on do tablicy wynikowej
       else 
        resultArray.add(result);
}
...
0

Każ klientowi czekać na odpowiedź serwera w osobnym wątku. W tym momencie nie będzie się przycinał.

0

lol!
1) po kazdyw write robisz out.flush()<i po sprawie
poza tym tok jak powiedzial Koziolek - Przydalyby sie osobne watki dla klienta i serwera...
temat poruszany juz byl na forum, jak wklejalem tez troche swojego kodu wiec poszukaj.
pozdrawiam

0

Małe nieporozumienie wynikło. Zapomniałem dodać jednej rzeczy do mojego pytania. Problemu nie ma w tym że czekanie odpowiedzi nie jest w osobnym wątku. Jakby było to i tak ten wątek by się zablokował (Nadal nie mógłby odebrać odpowiedzi - to jest problem), więc to nie rozwiązuje problemu. A to co zapomniałem dodać to to, że uruchamiając klienta i serwer na jednym komputerze wszystko działa jak należy tzn. serwer generuje wynik i przesyła go, a klient nie blokuje sie przy odbieraniu odpowiedzi. Problem wystepuje w przypadku, gdy serwer uruchomię na jednym a klienta na drugim kompie.

0

flush dla pewnosci i firewall
jak winda to otworz port w ustawieniach zabezpieczen firewalla

pozdrawiam

0

Dzięki za odpowiedź, ale znowu nie o to dokładnie mi chodziło... ;). Pisałem, że komunikacja przy uruchomieniu na dwóch kompach działa, klient odbiera wynik, nie odbiera go tylko w przypadku, gdy elementów na liście wynikowej jest więcej niż 8 - czyli w znaczej większości przypadków. Spowolnienie serwera sprawia, że klient odbiera kolejne osiem wyników, serwer znowu zostaje sztucznie spowolniony itd. - no jest to, lekko mówiąc, naciągane rozwiązanie. W takim przypadku flush może coś dać? Pytam, bo na razie przez jakiś czas nie mam możliwości sprawdzenia tego na kilku kompach.

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