当前位置: 首页 > 面试题库 >

socket.recv(recv_size)何时返回?

南宫鸿晖
2023-03-14
问题内容

从测试中,我得出结论,在以下三种情况下,结果socket.recv(recv_size)将会恢复。

  1. 连接关闭后。例如,客户端调用socket.close()或发生任何套接字错误,它将返回空字符串。

  2. 有些数据来了,数据的大小超过recv_size

  3. 一些数据来了,数据的大小小于recv_size并且短时间后没有更多数据来了(我发现0.1s可以工作)。

有关#3的更多详细信息:

#server.py

while True:
    data = sock.recv(10)
    print data, 'EOF'

#client1.py

sock.sendall("12345")
sock.sendall("a" * 50)

#client2.py

sock.sendall("12345")
time.sleep(0.1)
sock.sendall("a" * 50)

当我运行时client1.pyserver.py回显:

12345aaaaa EOF
aaaaaaaaaa EOF
aaaaaaaaaa EOF
aaaaaaaaaa EOF
aaaaaaaaaa EOF
aaaaa EOF

当我运行时client2.pyserver.py回显:

12345 EOF
aaaaaaaaaa EOF
aaaaaaaaaa EOF
aaaaaaaaaa EOF
aaaaaaaaaa EOF
aaaaaaaaaa EOF

我的结论正确吗?在哪里可以看到有关#3的官方说明?


问题答案:

是的,您的结论是正确的。socket.recv是一个阻止呼叫。

socket.recv(1024)将最多读取1024个字节,如果没有等待读取的数据将阻塞。如果您未读取所有数据,socket.recv则不会阻止其他调用。

socket.recv 如果连接已关闭或出现错误,也将以空字符串结尾。

如果要使用非阻塞套接字,则可以使用select模块(比仅使用套接字要复杂一些),也可以使用socket.setblocking

socket.setblocking过去我遇到过问题,但如果需要,可以随时尝试。



 类似资料:
  • 我知道当对象是特定类的实例时,instanceof返回TRUE。例如:

  • 问题内容: 当用Java编程时,我几乎总是出于习惯,编写如下代码: 大多数时候甚至都没有考虑它。现在,问题是:我应该 始终 将接口指定为返回类型吗?还是建议使用接口的实际实现,如果是,在什么情况下使用? 显然,使用该接口有很多优点(这就是为什么它存在的原因)。在大多数情况下,库函数使用哪种具体实现并不重要。但也许在某些情况下确实很重要。例如,如果我知道我将主要随机访问列表中的数据,那将是一个坏习惯

  • 好吧,好吧,但是当我的插座不阻塞时会发生什么??我搜索了一点(可能不够,谁知道呢?)并且不知道如何判断对方何时使用非阻塞套接字关闭了连接。似乎没有任何方法或属性告诉我们这一点,并且将的返回值与空字符串进行比较似乎绝对没有用……只是我有这个问题吗? 作为一个简单的示例,假设我的套接字的超时设置为1.2342342秒(无论您在这里喜欢什么非负数),并且我调用,但是另一方在1.2342342秒期间没有发

  • 问题内容: 说我有一些Java代码: 还有一些代码可以加载: 能永远?为什么/为什么不呢?如果是这样,在什么情况下? 问题答案: 根据此方法javadoc: 返回该类的类加载器。一些实现可能使用null来表示引导类加载器。如果此类是由bootstrap类加载器加载的,则此方法在此类实现中将返回null。

  • 问题内容: 我的日志显示此异常:由以下代码触发: 我试图弄清楚String.split返回空数组的条件。我的理解是,如果找不到匹配项,则返回大小为1且与原始字符串匹配的数组。 这是为Android build SDK版本21编译的Java。我期待听到我遗漏的明显细节。 问题答案: 返回结果的地方是。现在根据文档(限制由表示) 如果为零,则将尽可能多地应用该模式,该数组可以具有任何长度,并且 尾随的

  • 问题内容: 只是好奇什么时候回来。根据java.io.File Java文件 - 默认的临时文件目录由系统属性java.io.tmpdir指定。在UNIX系统上,此属性的缺省值通常为“ / tmp”或“ / var / tmp”;默认值为“ / tmp”或“ / var / tmp”。在Microsoft Windows系统上,通常为“ c:\ temp”。调用Java虚拟机时,可以为此系统属性赋