Witam!
Mam za zadanie stworzyć czat. Po nawiązaniu połączenia tworzone są wątki Pisarz i Czytelnik. Program wydaje się, że działa poprawnie, można się wymieniać wiadomościami. Aby zakończyć połączenie obie strony muszą wpisać exit. Proces klienta się kończy, a serwer nasłuchuje. Problem zaczyna się tutaj. Gdy znowu nawiąże połączenie to w serwerze wątek Pisarza się od razu wyłącza. Dokładnie jak to zaobserwowałem gdy dochodzi do linii:
line=line = reader.readLine()
od razu skacze do
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
Ma ktoś pomysł jak to poprawić? Dziękuję za każdą pomoc :)
Klasa KomunikatorServer
public class KomunikatorServer {
public static void main(String[] args) {
ServerSocket server = null;
ThreadGroup grupa = new ThreadGroup("Serwer");
try {
server = new ServerSocket(2222);
} catch (IOException e) {
System.out.println("Unavaible to listen on port 2222");
}
try {
while (true) {
Socket sSocket = server.accept();
System.out.println(
"Nawiązano połączenie z: " + sSocket.getInetAddress() + " o porcie: " + sSocket.getPort());
new Pisarz(grupa, sSocket).start();
new Czytelnik(grupa, sSocket).start();
while (grupa.activeCount() != 0) {
}
}
} catch (SocketException e) {
System.err.println("Socket exception :/");
} catch (UnknownHostException e) {
System.err.println("UnknownHost :/");
} catch (IOException e) {
System.err.println("IO Exception :/");
} finally {
try {
server.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
Klasa KomunikatorKlient
public class KomunikatorKlient {
public static void main(String[] args) {
Socket kSocket = null;
ThreadGroup grupa = new ThreadGroup("Klient");
try {
kSocket = new Socket("localhost", 2222);
System.out
.println("Utworzono połączenie z: " + kSocket.getInetAddress() + " o porcie: " + kSocket.getPort());
new Pisarz(grupa, kSocket).start();
new Czytelnik(grupa, kSocket).start();
while(grupa.activeCount()!=0){}
kSocket.close();
} catch (UnknownHostException e) {
} catch (IOException e) {
System.err.println("Uuu IOException");
}
}
}
Klasa wątku Czytelnik
public class Czytelnik extends Thread {
Socket sInput;
ThreadGroup grupa;
SimpleDateFormat time = new SimpleDateFormat("yyyy-MM-dd kk:mm:ss");
public Czytelnik(ThreadGroup grupa,Socket sInput) {
super(grupa, "Czytelnik");
this.sInput = sInput;
this.grupa = grupa;
}
@Override
public void run() {
String line = null;
BufferedReader reader = null;
try {
reader = new BufferedReader(new InputStreamReader(sInput.getInputStream()));
while ((line = reader.readLine()) != null) {
System.out.println(time.format(new Date()) + " " + line);
if (line.equals("exit")) {
System.out.println("Czytelnik zamknięty");
break;
}
}
} catch (IOException e) {
System.out.println("IOException");
}
}
}
Klasa wątku Pisarza
public class Pisarz extends Thread {
Socket sOut;
ThreadGroup grupa;
public Pisarz(ThreadGroup grupa, Socket sOut) {
super(grupa, "Pisarz");
this.sOut = sOut;
this.grupa = grupa;
}
@Override
public void run() {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
PrintWriter printer = null;
try {
printer = new PrintWriter(sOut.getOutputStream());
} catch (IOException e1) {
e1.printStackTrace();
}
String line = null;
try {
while ((line = reader.readLine()) != null) {
printer.println(line);
printer.flush();
if (line.equals("exit")) {
break;
}
}
} catch (IOException e) {}
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("Pisarz zamknięty");
}
}