Dziwny zachowanie funkcji

0

Witam. Piszę projekt na politechnikę. Mam zaprojektować grę scrabble + sieć w języku java. Dokładnie robię 2 klientów (JApplet) i obsługujący grę serwer. Mile widziana pomoc, ponieważ muszę uczyć się czegoś innego i spędza mi sen z powiek ten projekt. Po prostu stanąłem w miejscu.

Mam następujący problem:

mam klasę główną MyApplet oraz dopisaną klasę Serwer. Przesyłanie
obiektów szło bez problemu z appletu na serwer i odwrotnie. Dopisane mam
do wysyłania i odbierania funkcje w obu tych klasach:

public static Gracz odbieranie(Gracz gracz) throws Exception{

	ObjectInputStream input = new

ObjectInputStream(socket.getInputStream());
gracz=(Gracz)input.readObject();
return gracz;
}

public static void wysylanie(Gracz gracz)throws Exception{

	ObjectOutputStream output = new

ObjectOutputStream(socket.getOutputStream());
output.writeObject(gracz);
}

Przesyłam tymi metodami cały obiekt klasy Gracz. Odbieram od klientów
obiekt, wysyłam im z powrotem ten obiekt i gdy po kilku operacjach
ponownie chcę odesłać obiekt to rzucany jest wyjątek po stronie
klienta:
"java.lang.NullPointerException" (dotyczy on tego:
gracz=(Gracz)input.readObject();)
oraz "java.net.SocketException: Connection reset"
dotyczący (ObjectInputStream input = new
ObjectInputStream(socket.getInputStream()); ).

Spróbowałem zamiast odbierania od serwera obiektu, wysłanie mu go
ponownie i to się udało.

Drugi problem jest dla mnie nie do rozwiązania!!
Serwer tworzy obiekt klasy TablicaLiter, która rozlosowuje litery graczom. Wcześniej to losowanie odbywało się w Applecie. Dane były zapisywane do tablicy gracz.tablica();
Doszedłem do wniosku, że losowanie musi robić serwer, ponieważ to od przetrzymuje informacje o ilości pozostałych literek w "worku".

TERAZ NAJLEPSZE!!
Kiedy wysyłam obiekt z serwera do appletu (po losowaniu liter!) to litery te nie są odrysowywane na applecie (lecz tylko puste buttony). Po prostu ta instrukcja zwraca false:

if (g.litery[i]=="A")
{
kafle[i].setIcon(new ImageIcon("a.jpg"));
}

.
.
.
if (g.litery[i]=="Z")
{
kafle[i].setIcon(new ImageIcon("a.jpg"));
}

natomiast po dopisaniu esle i wyświetleniu w pętli "g.litery", pojawiają się wszystkie literki tak jak należy. Oznacza to, że te litery faktycznie tam "siedzą". Śmieszne jest to, że jeżeli przed którąś z tych funkcji wstawię g.litery[0]="A", to pierwszy kafelek dostaje literkę A. Myślałem ze chodzi o białe znaki, więc użyłem funkcji trim(). Bez skutku.

Dzięki za pomoc i pozdrawiam!

0

To jeszcze nie wiesz, że Stringi porównuje się metodą equals (a nie operatorem ==)?

0

hmmmmm w sumie racja. Tylko czemu w przypadku ręcznego ustawienia liter (g.litery[i]="A"), pojawiają się wszystkie obrazki pod buttonami. Nie działa tylko w przypadku porównywania z tablicą wysłaną z serwera.

Zaraz sprawdzę ten equals();

0

Nie rozumiem tego przyznam, ale equals działa. Nie przyszło mi to do głowy :)
dzięki wielkie bo nagłówkowałem się.

Proszę jeszcze o pomoc dotyczącą przesyłania obiektu gracz. Pierwsze wysyłanie działa, odbiór działa, przy drugim wysyłaniu rzucane są 2 wyjątki opisane u góry.
Podejrzewam za te problemy brak lub źle ustawione metody flush i close.

0

Na razie o Stringach. Operator == porównuje referencje. Nie jest zaskakujące, że po przypisaniu g.litery[i] = "A" w obu zmiennych są takie same referencje. Wymuś utworzenie nowego Stringu

g.litery[i] = new String("a");

i zbadaj efekty.

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