客户端从TCP套接字中丢失了一些行

时间:2011-12-22 03:36:42

标签: java sockets tcp stream newline

我的ServerSocket写出以下几行:

OutputStreamWriter outstream = new OutputStreamWriter(clientSocket.getOutputStream());

BufferedWriter out = new BufferedWriter(outstream);

out.write("Hello");
out.newLine();
out.write("People");

out.flush();

我的客户端就是这样读的:

in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
while(true){
    line = in.readLine();

    if(line == null){
        ClientDialog.gui.log.append("NULL LINE\r\n");
    } else{
        ClientDialog.gui.log.append(line+"\r\n");
    }

    if(in.readLine() == "SHUTDOWN"){
        break;
    }
}

正如您所看到的,我在套接字上写了“Hello”,一个新行,然后是“People”,但是当我运行我的客户端时,它只会重复打印“Hello”和null。我看不出有什么问题?


问题已解决:

在我将“人物”写入套接字后,我不得不添加out.newLine(),而我必须line == "SHUTDOWN"而不是in.readLine() == "SHUTDOWN"因为in.readLine()正在消费“人”

还建议在equals()课程中使用String方法,而不是==

谢谢!

这是为了未来的观众。

4 个答案:

答案 0 :(得分:9)

每个循环调用readLine两次。

if(in.readLine() == "SHUTDOWN"){
        break;
}

上面的代码会消耗您的“人物”行

将更改修改为

if("SHUTDOWN".equals(line){
            break;
}

此外,您应该在发送“人物”后发送换行符

答案 1 :(得分:3)

    if(in.readLine() == "SHUTDOWN")
    {
        break;
    }

应该是这样的:

    if(line == "SHUTDOWN")
    {
        break;
    }

您正在调用readLine()两次,因此消耗了一行

此外,在比较String类型时,您应该在String类中使用equals()方法:

    if(line != null && line.equals("SHUTDOWN"))
    {
        break;
    }

答案 2 :(得分:3)

我很确定你的in.readLine() == "SHUTDOWN"正在消费流中的“人”。进一步==也不起作用。

答案 3 :(得分:1)

发送人员后,您需要发送另一个换行符。您对readLine的调用正在等待它发出信号以处理更多数据。

尝试

out.write("Hello");
out.newLine();
out.write("People")
out.newLine();