Chat używający wątków. Wyłączający się wątek.

0

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");

	}
}
0

Dobrze problem został już naprawiony. Chodziło o to że nie można zamykać strumieniu System.in i pozniej chcieć z niego znów korzystać. No temat do zamknięcia :)

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