Java Socket.readLine()并不总是读取由newLine分隔的整个消息

时间:2016-06-06 16:58:22

标签: java sockets readline

readLine()在很多情况下工作正常,但很少次,我通过BufferedReader.readLine()读入的行是不完整的行。 This问题涉及类似问题。然而,解决方案并不令人满意。那里的解决方案说它可能是因为EOF特征。但在我的情况下,我根本不发送任何EOF字符。以下是我的代码:

/*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%保证。

1 个答案:

答案 0 :(得分:1)

问题是您的读取超时。如果发生这种情况,您可能会丢失数据。如果readLine()在一行中间超时,则到目前为止读取的部分将丢失。如果将它设置得太短,则会丢失大量数据,并且您将其设置得太短。你应该把它设置得更高,或者根本不使用它。