我遇到了奇怪的行为:
我有一个基于 java ServerSocket 的服务器,它服务于从 iPhone 设备发送的 TCP 请求。我注意到当我使用通过 wi-fi 连接的 iPhone 时,网络没有问题。iphone打开一个连接,然后按照它应该的方式从流中写入和读取,没有明显的延迟。到现在为止还挺好。但是,使用 3g 时,从发送第一条消息到响应完全返回,我经历了 1.5 秒的延迟。似乎在服务器将消息刷新到套接字之后立即读取消息的第一个字节,但消息的其余部分被延迟了大约一秒钟(!)。
我通过在 iphone 端打印缓冲区大小和在服务器端使用wireshark 监控网络来验证这种网络行为。 Wireshark 也显示了这一点- 第一个字节以 1 字节的消息大小发送(它始终为 0 BTW),其余消息随后以一个或多个大消息(约 1300 字节)发送。
消息由一个 8 字节的标头(2 个整数 - 类型和大小)和该大小的正文组成。
真正奇怪的是,在 c++ 中编写使用相同协议的类似服务器(使用 poco 服务器)运行良好。
我使用套接字的 DataOutputStream 使用 2 个 writeInt 指令和一个写入主体的 write(byte[]) 来写入标头。然后我刷新流。
有谁知道是否有一个套接字选项(在java中)会导致这种行为?
任何帮助将不胜感激。