【问题标题】:Java TCP packets via HTTP proxy通过 HTTP 代理的 Java TCP 数据包
【发布时间】:2016-01-14 03:44:31
【问题描述】:

我正在发送 TCP 数据包,每个数据包只有几位(一行文本左右)。我通过 HTTP 代理将它们发送到远程服务器但是由于某种原因,当与代理的连接速度很慢或与服务器中断时,只到达数据包的一个片段而不是整个数据包,它会导致服务器端出现异常,它是如何做到的可能吗?客户端有什么方法可以防止发送数据包的片段而不是整个数据包?

示例:我正在尝试发送此数据包:

packetHead: id (1-99)
integer: 1
short: 0
byte: 4

在我的情况下,有时会发生这种情况,服务器只到达 packetHead 和整数,而当与代理的连接不好时,其余的数据包会丢失。

我无权修改服务器源代码,所以我需要在客户端修复它。

感谢任何提示。

【问题讨论】:

  • 在不知道您的服务器、您的代理甚至您的发送代码的情况下,它只是在黑暗中钓鱼。如果您不使用外来代理并且可以排除服务器端错误,那么我会说有时您的发送代码在触发传输之前仅部分填充了 tcp 发送缓冲区。但这只是一个疯狂的猜测。 TCP 是一个经过良好测试的协议,标准代理希望不会产生这样的错误,即使消息是分段的,我对此表示怀疑。你用嗅探器检查过吗?

标签: java sockets exception tcp proxy


【解决方案1】:

请说明您如何发送数据。每次我遇到类似的问题时,我没有刷新流是我的错。特别是如果流被压缩,您需要在 GZIP 或类似对象上调用 close/complete 以实际发送所有内容。

【讨论】:

  • 这是我发送数据的方式,但正如我所说,当我使用直接连接时它运行良好,只有当我通过代理连接时才会出现问题。 pastebin.com/zt53Ch4x
  • 在末尾再添加一行:'serverOut.flush();'看看有没有帮助。
  • 我已经尝试过了,但我仍然在服务器端遇到错误,数据包以格式错误的格式到达,但我意识到这只发生在某些代理上我不确定它是随机的还是是否有特定的代理地址正在以某种方式修改数据包?我正在使用公共代理进行测试。
  • 在服务器端有 netty,由于某种原因它给了我超时异常,比如这个:pastebin.com/t8MNZcAB
  • 不要只是尝试。最后的同花跟注应该一直存在。我不知道 serverOut 是什么类或实现(它是来自套接字的普通流还是更具体的 Http 连接),但您的数据正在通过 Http 代理传输。
猜你喜欢
  • 1970-01-01
  • 2010-12-21
  • 2022-11-11
  • 2012-09-27
  • 2023-03-16
  • 1970-01-01
  • 2010-11-29
  • 2018-12-01
  • 2013-07-05
相关资源
最近更新 更多