套接字OutputStream :: write方法混合TCP数据包?

时间:2015-08-27 17:50:11

标签: java sockets tcp

我对java socket有一些问题。

我创建了一个简单的代理服务器,它监听http请求,将此请求传递给源,然后返回响应,而不断开连接。有时客户端会收到无效数据。我看了tcp dump logs,我发现tcp包是混合

这是一个非常简单的代码示例

Socket socket = new Socket("127.0.0.1", 3000);

OutputStream out = socket.getOutputStream();
InputStream in = socket.getInputStream();

while (true) {
    final Request request = Request.read(in);
    if (request == null) return;

    try {
        // send http request 
        HttpRequest httpRequest = HttpRequest.factory(request);
        Response response = httpRequest.response();

        ByteArrayOutputStream buffer = new ByteArrayOutputStream();

        buffer.write(response.headers.toString());
        buffer.write(response.body);

        out.write(buffer.toByteArray());
        out.flush();
    } catch (ParserException | IOException e) {
        e.printStackTrace();
        return;
    }
}

这是一个屏幕tcp转储日志,您可以在一个tcp数据包中看到3个http响应http://dl2.joxi.net/drive/0009/2601/629289/150827/004858080b.jpg

为什么会发生这种情况,以及如何解决这个问题?

更新28.10.2015 17:50

对不起,伙计们,这是我在服务器端的错。 Java工作得很好

1 个答案:

答案 0 :(得分:1)

您所看到的是预期的正确行为。 UITableView标头表示连接保持打开状态,以便可以将其用于多个HTTP请求。如果它与流水线相结合,响应甚至可能出现在单个TCP段中。