No więc chciałbym napisać sobie sieciowego ponga w klient-serwer (dwóch klientów). Zaimplementowałem sobie ruchy paletkami, tj. klient ruszając myszką powoduje ruch paletki i na bieżąco ją sobie maluje metodą repaint(), zaś Timer co ileś tam ms najpierw sprawdza, czy położenie paletki zmieniło się względem ostatniego sprawdzenia, jeśli tak, to wysyła pozycje jego paletki do serwera, serwer odsyła ją drugiemu klientowi. W localhoście wszystko śmiga aż miło, jednak gdy uruchamiam serwer na swoim koncie shellowym mam spore lagi.
Tutaj jest kod zadania timera (nr to numer klienta, 1 to klient z lewą paletką, 2 - z prawą, tab1 to położenie lewej paletki w pionie, tab2 - drugiej, dodam, że dataout jest typu DataOutputStream)
class Zadanie extends TimerTask
{
public void run( )
{
try
{
if ((nr==1)&&(tab1!=ostatni)) dataout.writeShort(tab1);
if ((nr==2)&&(tab2!=ostatni)) dataout.writeShort(tab2);
}
catch (Exception e)
{
System.out.println(e);
}
if (nr==1) ostatni = tab1;
if (nr==2) ostatni = tab2;
repaint();
}
}
W tej sytuacji klient wysyła położenie paletki tylko gdy zmieniło się od poprzedniego sprawdzenia - w takiej konfiguracji mam lagi. Dziwną rzeczą jest fakt, że jesli klient nie sprawdza, czy położenie paletki zmieniło się, tylko wysyła cały czas w timerze co kilka ms (czyli w konsekwencji częstotliwość wysyłania jest dużo większa) to lagów paradoksalnie nie ma!
Tutaj przerobiona wersja zadania timera (wysyła dane bez sprawdzeń przy każdym "ticku" timera ,lagów nie ma):
class Zadanie extends TimerTask
{
public void run( )
{
try
{
if (nr==1) dataout.writeShort(tab1);
if (nr==2) dataout.writeShort(tab2);
}
catch (Exception e)
{
System.out.println(e);
}
repaint();
}
}
Przecież nie powinienem zużywać łącza w przypadku, gdy nie ma takiej potrzeby. Jak rozwiązać ten problem?
Tu daję cały kod, fajnie, jakby ktoś przetestował:
http://www.speedyshare.com/files/27679645/Net_Pong.rar