Dobry wieczór. Piszę komunikator klienci-serwer. Przy połączeniu klienta do serwera, serwer wysyła mu identyfikator (ID) natomiast klient wysyła do serwera swój nick, np. Maciej (żeby potem serwer mógł rozesłać ten nick innym klientom aby widzieli tego Macieja na liście ONLINE. Czyli serwer->klient (ID) oraz klient->serwer (nick). Obie klasy Klient i Serwer (osobne aplikacje) są wykonywane jako osobne wątki. Tutaj fragment kodu:
Klasa Server programu Serwera:
public void run() {
int guid = 1;
while(true) {
try {
Socket socket = server.accept();
sendWelcomeMessage(socket, guid);
getWelcomeMessage(socket, guid);
} catch(IOException e) {}
}
}
private void sendWelcomeMessage(Socket socket, int id) {
try {
ObjectOutputStream onServer = new ObjectOutputStream(socket.getOutputStream());
onServer.writeInt(id);
//onServer.close();
} catch(IOException e) { System.out.println("send " + e); }
}
private void getWelcomeMessage(Socket socket, int id) {
String welcomeMsg = null;
try
{
ObjectInputStream fromServer = new ObjectInputStream(socket.getInputStream());
welcomeMsg = fromServer.readUTF();
//onServer.close();
}
catch(IOException e) { System.out.println("get " + e);}
}
oraz kod klasy Client programu klienta:
public void run() {
sendWelcomeMessage();
getWelcomeMessage();
}
private void getWelcomeMessage() {
try {
ObjectInputStream fromServer = new ObjectInputStream(socket.getInputStream());
int welcomeMsg = fromServer.readInt();
System.out.println(welcomeMsg+"a");
//fromServer.close();
}
catch(IOException e) { System.out.println("get " + e); }
}
private void sendWelcomeMessage() {
try {
ObjectOutputStream onServer = new ObjectOutputStream(socket.getOutputStream());
onServer.writeUTF(nickname);
onServer.close(); // gwiazdka*
} catch(IOException e) { System.out.println("send " + e); }
}
Pętla while w klasie serwera oczywiście odpowiada za to aby mogli się podłączać również inni klienci. Jak widzicie mam zakomentowane zamykanie strumieni (prócz jednego). Gdy je odkomentuje wszystko będzie działało tak samo, tzn. klient poprawnie wysyła swój nick do serwera i mogę go odczytać natomiast serwer nie wysyła ID do klienta, pojawia się wyjątek
get java.net.SocketException: Socket is closed
Natomiast wystarczy że zakomentuję linię oznaczoną jako "gwiazdka*" to program jakby się przywiesza i nic się nie dzieje - nic do siebie nie wysyłają. Jak poprawnie to zrobić żeby te wiadomości dochodziły w obie strony? Proszę o wyrozumiałość dopiero się uczę.