最近,我开始使用 WP7 的 Mango 版本中引入的 System.Net.Sockets 类,并且总体上很喜欢它,但注意到在调试模式下传输数据的延迟与在手机上正常运行时的延迟存在差异。
我正在编写一个“远程控制”应用程序,当用户点击应用程序中的按钮时,它通过 Wifi 将单个字节传输到我的 LAN 上的本地服务器。因此,应用程序的感知响应性/及时性对于良好的用户体验非常重要。
通过 USB 电缆将手机连接到我的 PC 并在调试模式下运行应用程序,TCP 连接似乎在用户点击按钮时传输数据包的速度很快。
在手机与 PC 断开连接的情况下,用户最多可以点击 7 个按钮(因此,在发送所有 7 个字节之前,有 7 个带有 1 个字节有效载荷的“发送”命令。)如果用户点击一个按钮并在两次点击之间稍等片刻,似乎有1秒的延迟。
我已经尝试将 Socket.NoDelay 设置为 True 和 False,它似乎没有任何区别。
为了查看发生了什么,我使用了数据包嗅探器来查看流量情况。
当手机通过 USB 连接到 PC(使用 Wifi 连接)时,每个单独的字节都在自己的数据包中,间隔约 200 毫秒。
当手机在自己的 Wifi 连接(从 USB 断开)上运行时,字节仍然有自己的数据包,但它们都以 4 或 5 个数据包的突发分组在一起,每组与下一组相距约 1000 毫秒。
顺便说一句,从我的笔记本电脑测量,我的 Wifi 网络上到服务器的 Ping 时间只有 2 毫秒。
我意识到将“发送”缓冲在一起可能可以让手机节省能源,但是有没有办法禁用这种“延迟”?应用程序的响应能力比省电更重要。