Прошла задание Чат. Но чтобы лучше прочувствовать сокеты и компанию решила написать такой же чат сама с нуля. Решила пойти от простого к сложному и сначала написать сервер и одного клиента. Сервер принимает сообщения клиента, пока тот не введет ключевое слово. Сначала написала реализацию с помощью BufferedReader и BufferedWriter:
Server:
ServerSocket serverSocket = new ServerSocket(8000);
System.out.println("Server is started");
// while (true){
Socket connection = serverSocket.accept();
System.out.println("client is connected " + connection.getRemoteSocketAddress());
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
System.out.println("Start listening messages");
String message = "";
try {
while (!message.equals("exit")) {
message = in.readLine();
System.out.println(message);
}
}catch (Exception e){
}
System.out.println("Connection is closed");
in.close();
connection.close();
}
Client
Socket connection = new Socket("127.0.0.1",8000);
System.out.println("Connected with server");
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(connection.getOutputStream()));
BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Start Sending message");
String message = "";
while (!message.equals("exit")){
System.out.println("Enter message");
message = consoleReader.readLine();
out.write(message);
}
out.close();
System.out.println("Closing");
connection.close();
После запуска сервера и клиента картина следующая: Клиент отправляет сообщения, сервер слушает и ничего не выводит, после того, как клиент ввел ключевое слово и поток out закрылся, сервер выдал все скопом, что писал клиент.
Я уже подзабыла стримы и ридеры. Но такое поведение вроде бы понятно, по аналогии с файлом, мы не можем начать ридером читать из файла, пока райтер, пишущий в тот же файл не закончил работу, верно?
Заменила ридеры на ObjectInputStream и ObjectOutPutStream,все стало работать красиво, клиент отправляет, очередное сообщение - сервер тут же печатает.
Подскажите, почему в случае с ObjectInputStream сервер не ждет закрытие потока out?