【发布时间】:2015-11-22 05:47:07
【问题描述】:
我对 java 套接字有一些问题。
我创建了一个简单的代理服务器,它监听 http 请求,将此请求传输到源,然后返回响应,而不会断开连接。有时客户端会收到无效数据。我查看了 tcp 转储日志,发现 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 完美运行
【问题讨论】:
-
这个是没有办法写代理的。您正在引入各种不必要的延迟。所有这些 I/O 都可以直接在输出流中完成。 ByteArrayOutputStream 没有任何贡献。但是您也不需要 HTTP 请求对象。一旦你从客户端读取了第一行,剩下的就是来回复制字节。
-
谢谢你的答案。这段代码非常非常简单,仅作为示例编写。在实际项目中,它不是简单的代理,而是多线程的多连接和大量的业务逻辑