【发布时间】:2013-08-14 15:28:13
【问题描述】:
我正在使用套接字库 (SOCK_STREAM) 在 Python 中开发小型服务器。服务器应该接收很多小消息(25-40字节),处理它们并尽可能快地转发。
在 Linux 和 OSX 上完美运行,socket 的 recv 函数一到达就返回数据。不幸的是,在 Windows (8 Pro) 上,它似乎在从 recv 函数返回之前累积数据。
我尝试使用 recv 函数限制读取的最大数据量,但这并没有太大帮助。看起来数据是内部积累的。
我必须在服务器(Python)或客户端(Java 的 Socket)中设置任何特定的 Socket 选项吗?
编辑
我的一位同事建议通过填充虚拟数据将每条消息四舍五入到 1KB。 这可能有助于避免@PeterLawrey 指出的内部缓冲区。
我没有机会尝试。您认为它可能有帮助吗?它是有效且被广泛采用的技术?
【问题讨论】:
-
你使用 TCP 吗?你设置 SO_NODELAY 对吗?否则发送方会缓存数据。
-
如果他在其他平台上获取数据,这应该不是问题。假设他使用的是同一个发送者,无论服务器在哪里运行。
-
@Joni 我没有在客户端设置任何特定选项,所以我想它默认为 Android 上的标准 Java 选项。在服务器上我只设置了 SO_REUSEADDR。
-
@xaxxon 服务器和客户端的代码在所有平台上都是一样的。
-
您可以关闭 nagle,但操作系统和网络适配器可以自行合并。我建议使用网络适配器而不是操作系统。
标签: java windows sockets python-2.7