【问题标题】:Networking issue from java ServerSocket to iphone (only on 3g mode)从 java ServerSocket 到 iphone 的网络问题(仅在 3g 模式下)
【发布时间】:2011-05-14 20:46:50
【问题描述】:

我遇到了奇怪的行为:

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

任何帮助将不胜感激。

【问题讨论】:

    标签: java iphone networking wireshark serversocket


    【解决方案1】:

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

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

    谢谢, 利奥

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2013-06-03
        • 1970-01-01
        • 1970-01-01
        • 2011-05-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-04
        相关资源
        最近更新 更多