无法查看来自简单 Java 代理服务器的数据



我已经实现了一个简单的代理服务来窃听与微服务(MS(之间的消息。它基本上有一个ServerSocket侦听传入连接,并通过Socket连接将请求转发到MS。

它还接收来自 MS 的响应并将其转发给客户端。

我正在窃听消息并暂时打印出来。(我打算稍后做其他验证工作(

但是,我的问题是我在响应中看不到MS返回的数据本身。我只看到 HTTP 标头详细信息。

例:

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(中打印的输出之一中看到响应消息("你好康提2.">(。但是,我在那里什么也没看到。但是,预期的响应似乎正在到达我的客户端程序(在上面的示例中为 cURL(,并且正在整齐地打印出来,如(4(所示。

另外,我在想最后的例外意味着什么?

它由以下行抛出:

while ((bytes_read = from_server.read(replyBuffer)) != -1) 

但是,这不会停止向客户端传递响应。

有人可以帮助我了解这里发生了什么,以及如何从代理服务从客户端微服务接收的中提取数据

------------------------
编辑

我不从流中检索任何标头信息。我只是从套接字流中读取所有字节并打印出来。

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();
}


谢谢沙比尔

找到了问题的答案:

  1. 我在sout中没有看到任何数据的原因是,在第二个循环中:

我从服务中读取到reply_buffer,但正在打印request_buffer。所以,如果你看到(3(它是一遍又一遍打印的相同的东西。通过打印出正确的reply_buffer我按预期得到以下内容:

-----------------------
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: */*
-----------------------
    异常
  1. 的原因是因为程序无法知道服务器端已关闭其连接,除非在尝试读取时引发异常以指示这一点。这是因为代理服务无法知道还剩下多少数据,或者这是否是传入数据的最后一位。

    如此堆栈溢出线程中所述,唯一的选择是捕获异常并正常传递,或者从服务器分配特殊令牌以指示这是发送的最后一位数据。

谢谢大家
沙比尔

最新更新