readLine() отлично работает во многих случаях, но несколько раз, строка, которую я читал BufferedReader.readLine(), является неполной линией. This вопрос о подобной проблеме. Однако решения не являются удовлетворительными. Решение там говорит, что это возможно из-за характера EOF. Но в моем случае я вообще не посылаю ни одного символа EOF. Ниже приведены мои коды:Java Socket.readLine() не всегда читает целое сообщение, разделенное newLine
/*Sending Code*/
public void sendToLocalDaemon(String msg){/*msg have no New line or \r*/
localMachineWriter.println(msg);
}
/*Receiving Code*/
public int receiveFromCoordinator(){
String response = "";
while(true){/*Each message separated from new line will have its independent meaning.*/
try{
coordinator.setSoTimeout(1);
try{
response = coordinatorReader.readLine();
}
catch(java.net.SocketTimeoutException e){
response = null;
}
if(response == null){
return coordinatorsMessage.size();
}
coordinatorsMessage.add(response);
}
catch(IOException e){
log(e.getMessage());
//System.exit(0);
}
}
}
/*This is how I set reader and writer*/
public void setReaderWriter() throws IOException{
this.coordinatorWriter = new PrintWriter(coordinator.getOutputStream(),true);
this.coordinatorReader = new BufferedReader(new InputStreamReader(coordinator.getInputStream()));
}
Пожалуйста, предложите мне как-нибудь, чтобы сделать эту работу правильно. Или предложите мне другой способ, с помощью которого я могу читать целые сообщения со 100% гарантией.
Не могли бы вы добавить ввод, который заставляет строку, прочитанную 'BufferedReader.readLine()' быть неполной, на ваш вопрос? Например, весь ввод и вывод 'readLine()'. –
Как указано в одном из ответов в связанном вами вопросе, я думаю, что процесс, который записывается в ваш сокет, не закончил писать в ваш сокет, когда вы его читаете. – Supahupe
@JonnyHenly Я могу вставить вход, но я исследовал его происхождение с любой строкой. Мои сообщения состоят из (0-9 и: и # и _ и буквы «E» и буквы «A»). Эта проблема возникает только с длинными строками. – PHcoDer