Socket, BufferedReader hangs at readLine()

后端 未结 4 1197
广开言路
广开言路 2020-12-08 07:52

I have a server which initially does this:-

BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
for (;;) {
  String cmdLine =          


        
相关标签:
4条回答
  • 2020-12-08 08:24

    I had the same problem and here is my solution:

    try {
        StringBuilder response = new StringBuilder();
        response.append("SERVER -> CLIENT message:").append(CRLF);
        //Infinite loop
        while (true) {
            //Checks wheather the stream is ready
            if (in.ready()) {
                //Actually read line 
                lastLineFromServer = in.readLine();
                //If we have normal behavior at the end of stream
                if (lastLineFromServer != null) {
                    response
                            .append(lastLineFromServer)
                            .append(CRLF);
                } else {
                    return response.toString();
                }
            } else {//If stream is not ready
                //If number of tries is not exceeded
                if (numberOfTry < MAX_NUMBER_OF_TRIES) {
                    numberOfTry++;
                    //Wait for stream to become ready
                    Thread.sleep(MAX_DELAY_BEFORE_NEXT_TRY);
                } else {//If number of tries is exeeded
                    //Adds warning that things go weired
                    response
                            .append("WARNING \r\n")
                            .append("Server sends responses not poroperly.\r\n")
                            .append("Response might be incomplete.")
                            .append(CRLF);
                    return response.toString();
                }
            }
        }
    } catch (Exception ex) {
        ex.printStackTrace();
        return "";
    }
    
    0 讨论(0)
  • 2020-12-08 08:36

    The answer might be late but this is the simplest and latest answer in 2020, just use the simple way to receive the data from the socket server or client using the input stream read() method.

    EOFException will be thrown when the client is disconnected or the server closed the connection.

    private String waitForData() throws IOException {
        String data = "";
        do {
            int c = inputStream.read();
            if (c > -1) data += (char) c;
            else throw new EOFException();
        } while (inputStream.available() > 0);
        return data;
    }
    
    0 讨论(0)
  • 2020-12-08 08:39

    eee's solution works perfectly. I was trying to read output from an SMTP conversation but it would block on:

    while ((response = br.readLine()) != null) {
        ...Do Stuff
    }
    

    Changing to:

    while (br.ready()) {
        response = br.readLine();
        ...Do Stuff
    }
    

    I can read everything just fine. br is a BufferedReader object, BTW.

    0 讨论(0)
  • 2020-12-08 08:50

    There is data already in the first BufferedReader (that has been read from the socket, and is no longer available from the socket), so pass the BufferedReader created in the first example to the class that reads the app specific messages, rather then creating a new BufferedReader from the socket.

    0 讨论(0)
提交回复
热议问题