【问题标题】:HTTP Message Body is not Received未收到 HTTP 消息正文
【发布时间】:2011-12-25 15:39:59
【问题描述】:

我在公司的一个客户网站上遇到了一个非常奇怪的问题。 我们的系统尝试将 HTTP 请求发送到站点中的一台服务器。 服务器运行在从 DMZ 中运行的机器上。

客户端是Java,服务器是C#。 我的代码通过以下方式发送 HTTP 请求:

[编辑 - 从伪代码更改为实际代码]:

Socket s = new Socket();
socket.connect([server address], timeout);

SocketOutputBuffer output = new SocketOutputBuffer (socket);

byte[] buffer = [creating the HTTP request headers]
output.write(buffer);
output.flush();

buffer = [creating the message body]
output.write(buffer);
output.flush();

调试客户端应用程序时,最后一个“output.flush()”成功完成。 在服务器端,我看到服务器端只接收到 HTTP 标头。

奇怪的是,如果我在最后一次刷新后关闭套接字,消息体就会到达服务器。

有什么想法吗?

非常感谢。

【问题讨论】:

  • 很难在没有看到实际代码的情况下进行诊断。既然您知道第一次刷新有效,您是否尝试过省略它并仅在消息正文之后刷新?
  • 我已经更新了代码,我会尝试省略第一次刷新。谢谢。

标签: http sockets client-server


【解决方案1】:

什么样的Java?什么平台?你在这之后关闭套接字吗?您是否正确关闭了套接字? 在许多情况下,您必须以允许其完成发送缓冲数据的方式将套接字设置为关闭(不能保证刷新...)

【讨论】:

  • 客户端在 Android 设备 (2.1) 上运行。 “将套接字设置为关闭”是什么意思?你的意思是关闭套接字?我的连接是将数据流式传输到服务器,因此我需要在整个会话期间打开它。感谢您的回复。
  • @LiorOhana:O'Rooney 指的是套接字的延迟选项,它决定了在关闭套接字时,当出站数据仍处于未决状态时套接字的行为方式。默认情况下,套接字会在一段时间内继续在后台发送数据,即使套接字的应用程序句柄已被禁止进一步使用。
  • @Remy:只是为了确保我理解,你的意思是我的连接可能由于某种原因变得无效,这就是为什么刷新可能不起作用? 10x
  • @LiorOhana:不,我不是这么说的。当我说“无效”时,我指的是您的代码在完成连接后关闭连接。从您的应用程序的角度来看,底层套接字不再有效,但在操作系统完全使其无效之前,它可能仍在进行后台工作。如果您真的想知道发生了什么,请尝试使用数据包嗅探器来观察网络流量,确保在发送标头后调用 flush() 不会过早关闭连接。
  • @Remy:我的问题不是在套接字关闭后没有发送的缓冲数据。我需要在整个会话期间保持连接打开。每次写入后,我都会调用flush,但在服务器上看不到任何东西(使用嗅探器)。
猜你喜欢
  • 2021-04-15
  • 1970-01-01
  • 1970-01-01
  • 2018-05-15
  • 2014-02-17
  • 2012-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多