2

我遇到了奇怪的行为:

我有一个基于 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中)会导致这种行为?

任何帮助将不胜感激。

4

2 回答 2

1

我通过用 BufferedOutputStream 包装套接字输出流解决了这个问题:

DataOutputStream dos = new DataOutputStream(new BufferedOutputstream(sock.getOutputStrean()));

谢谢,里奥

于 2011-05-20T23:03:38.733 回答
0

我建议您发布您的服务器的 Wireshark 跟踪,因为这可以提供一些关于配置了哪些 TCP 套接字选项以及从握手到第一个数据传输器的时间线的见解

于 2011-05-16T16:36:58.513 回答