Сокет (C/Java) BufferedReader readLine() не останавливается
Я создаю форум с интерфейсом Java и C-сервером.
У меня проблемы с отправкой сообщения с C на Java....
Я создал сокет (с именем "socket"), который работает следующим образом:
socket = new Socket(adr, port);
//adr and port are defined before
Но при этом на Java:
String str =null;
try {
BufferedReader br = new BufferedReader( new InputStreamReader(socket.getInputStream()) );
while ((str=br.readLine()) != null && str.length()>0)
{
System.out.println("str = " + str);
}
br.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Он просто не может получить сообщение с сервера. Он показывает только сообщение, когда я жестоко закрываю C-сервер.
Вот как сервер отправляет сообщение через сокет:
write(client_sock,"0\0",strlen("0\0"));
Я понятия не имею, как получить этот "0", не закрывая сервер. Есть идеи?
2 ответа
readLine() прочитал отправленные данные, но блокирует, пока не будет прочитан перевод строки или возврат каретки
Если ваш клиент видит данные только в том случае, если вы закрываете сервер, ваш сервер никогда не отправляет перевод строки или возврат каретки.
Предполагая, что вы хотите отправить файл построчно клиенту (например, в Java, это мой основной язык):
Socket client = server.accept();
OutputStream os = client.getOutputStream();
BufferedReader br = new BufferedReader( new InputStreamReader(Files.newInputStream(file.toPath())));
String str;
while ((str = br.readLine()) != null && str.length() > 0) {
os.write((str).getBytes());
}
br.close();
os.close();
Как видите, сервер не отправляет перевод строки или возврат каретки. Они были удалены readLine()!
Таким образом, readLine() на вашей стороне клиента блокируется, пока сокет не закроется.
Если вы измените инструкцию записи таким образом:
os.write((str+"\n").getBytes());
Ваш клиент может читать строки, даже если сервер все еще пишет следующие строки.
Вы зацикливаетесь до readLine()
возвращается null
или пустая строка.
Возвращается null
в конце потока. Когда вы читаете из сокета, это происходит только тогда, когда узел закрывает соединение.
Возвращает пустую строку, когда вход содержит пустую строку.
Ergo peer не закрывает соединение и не отправляет пустую строку.