我已经实现了一个简单的代理服务来窃听发往和来自微服务(MS)的消息。它基本上有一个ServerSocket监听传入连接并通过Socket连接将请求转发到MS。
它还接收来自MS的响应并将其转发给客户端。
我正在窃听这些消息并暂时将其打印出来。 (我打算稍后做其他验证工作)
但是,我的问题是我在响应中看不到 MS 返回的数据本身。我只看到 HTTP header 详细信息。
示例:
1。从客户端到代理
curl http://localhost:9099/anrl/hello/Kandy2
2。代理服务收到上述请求后打印的消息:
Incoming from Client [95] bytes --------------->
GET /anrl/hello/Kandy2 HTTP/1.1
Host: localhost:9099
User-Agent: curl/7.51.0
Accept: */*
-----------------------
3。代理服务打印的 MS 响应
Incoming from Server [82] bytes --------------->
GET /anrl/hello/Kandy2 HTTP/1.1
Host: localhost:9099
User-Agent: curl/7.51.0
Accept: */*
-----------------------
Incoming from Server [14] bytes --------------->
GET /anrl/hello/Kandy2 HTTP/1.1
Host: localhost:9099
User-Agent: curl/7.51.0
Accept: */*
-----------------------
java.net.SocketException: Socket closed
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:170)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at java.net.SocketInputStream.read(SocketInputStream.java:127)
at shabir.mcgill.proxy.service.ProxyService.runServer(ProxyService.java:124)
at shabir.mcgill.proxy.service.ProxyService.main(ProxyService.java:32)
4。客户端控制台中打印的响应
Hello Kandy2.
我希望在上面 (3) 中打印的输出之一中看到响应消息 ('Hello Kandy2.') 。但是,我在那里什么也没看到。然而,预期的响应似乎正在到达我的客户端程序(上面示例中的 cURL),并且正在整齐地打印出来,如 (4) 所示。
另外,我在想最后的异常表示什么?
它是由这一行抛出的:
while ((bytes_read = from_server.read(replyBuffer)) != -1)
但是,这并不会阻止将响应传递给客户端。
有人可以帮助我了解这里发生的情况以及如何从代理服务从两个接收到的流中提取数据吗?客户端和微服务。
------------------------------------
编辑
我没有从流中检索任何 header 信息。我只是从 Socket 流中读取所有字节并打印它。
final InputStream from_client = client.getInputStream();
final InputStream from_server = server.getInputStream();
while ((bytes_read = from_client.read(requestBuffer)) != -1) {
to_server.write(requestBuffer, 0, bytes_read);
System.out.println("Incoming from Client [" + bytes_read + "] bytes --------------->\n " +
new String(requestBuffer, Charsets.UTF_8) + "-----------------------");
to_server.flush();
}
while ((bytes_read = from_server.read(replyBuffer)) != -1) {
try {
Thread.sleep(1);
System.out.println("Incoming from Server [" + bytes_read + "] bytes --------------->\n " +
new String(requestBuffer, Charsets.UTF_8) + "-----------------------");
} catch (InterruptedException e) {
e.printStackTrace();
}
to_client.write(replyBuffer, 0, bytes_read);
to_client.flush();
}
谢谢
沙比尔
最佳答案
找到问题的答案:
- 我在 sout 中没有看到任何数据的原因是,在第二个循环中:
I read from the service into reply_buffer, but am printing request_buffer. So, if you see (3) it's the same thing printed over and over again. By printing out the correct reply_buffer I get the following as intended:
-----------------------
Incoming from Server [82] bytes --------------->
HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 15
Content-Type: *//*
-----------------------
Incoming from Server [15] bytes --------------->
Hello Kandy2..
Connection: keep-alive
Content-Length: 15
Content-Type: */*
-----------------------
出现异常的原因是,程序无法知道服务器端已关闭其连接,除非在尝试执行以下操作时抛出异常来表明这一点:读。这是因为代理服务无法知道还剩下多少数据或者这是否是传入数据的最后一位。
如上所述in this stack-overflow thread唯一的选择是捕获异常并优雅地传递,或者从服务器分配一个特殊 token 来指示这是发送的最后一位数据。
谢谢大家
沙比尔
关于java - 无法从简单的 Java 代理服务器查看数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45147687/