PHcoDer
PHcoDer

Reputation: 1236

Java Socket.readLine() not always reading whole message separated by newLine

readLine() works fine in many cases but few times, the line I read in by BufferedReader.readLine() is incomplete line. This question talks about similar issue. However the solutions are not satisfactory. A solution there says that it maybe because of EOF character. But in my case I am not sending any EOF character at all. Below are my codes:

/*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()));
}

Please either suggest me someway to make this work correctly. Or suggest me some other way by which I can read whole message, with 100% guarantee.

Upvotes: 2

Views: 1339

Answers (1)

user207421
user207421

Reputation: 311050

The problem is your read timeout. If it happens, you can lose data. If readLine() times out in the middle of a line, the part read so far is lost. If you set it too short, you will lose a lot of data, and you're setting it much too short. You should set it much higher, or not use one at all.

Upvotes: 1

Related Questions