python - 我无法理解 python 中的套接字编程代码
问题描述
我是套接字领域的初学者,最近尝试用它创建一个终端聊天应用程序。我仍然无法理解 setblocking 和 select 功能
“这是我从正在读取的网站中获取的代码,如果数据中没有任何内容,则代码中的代码,这意味着套接字已断开连接,还请解释是什么影响服务器中的 setblocking 或客户确实如此。我在某处读到 setblocking 允许在数据未完全收到时继续前进,我对解释不太满意。请用简单的话解释“
import select
import socket
import sys
import Queue
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.setblocking(0)
server_address = ('localhost', 10000)
server.bind(server_address)
server.listen(5)
inputs = [ server ]
outputs = [ ]
message_queues = {}
while inputs:
readable, writable, exceptional = select.select(inputs, outputs, inputs)
for s in readable:
if s is server:
connection, client_address = s.accept()
connection.setblocking(0)
inputs.append(connection)
message_queues[connection] = Queue.Queue()
else:
data = s.recv(1024)
if data:
message_queues[s].put(data)
if s not in outputs:
outputs.append(s)
else:
if s in outputs:
outputs.remove(s)
inputs.remove(s)
s.close()
解决方案
如果data里面什么都没有,怎么说明socket已经断开了
recv()的 POSIX 规范说:
成功完成后,recv () 将返回消息的字节长度。如果没有消息可以接收并且对等体已经执行了有序的关闭,recv () 将返回 0。...
在 Python 接口中,返回值 0 对应于返回的长度为 0 的缓冲区,即data
.
什么会影响服务器或客户端中的 setblocking。
将setblocking(0)
套接字设置为非阻塞,即如果不能立即完成accept()
或recv()
不能立即完成,则操作失败而不是阻塞直到完成。在给定的代码中,这几乎不会发生,因为在可能之前不会尝试操作(由于使用select()
)。然而,这个例子很糟糕,因为它包含output
在select()
参数中,导致一个繁忙的循环,因为output
大多数时间都是可写的。
推荐阅读
- git - 是否可以跟踪子模块内的文件?
- javascript - Javascript - 使用带有变量的 document.getelementbyid().value
- windows - 如何创建桌面快捷方式来启动 java JAR
- javascript - 如何根据第三个下拉列表项的选择切换不同的标签(下拉列表和列表)?
- sql - 将值与数据集中的前 n 个值进行比较
- python - 正在传递给 scipy.optimize.minimze 的函数的未知额外位置参数
- html - for循环中的几个标签
- python - 如何在 Pandas 中编辑标题行 - 样式
- python - 如何使用超链接更改 Django 中的实例?
- javascript - Vue.JS 中的数组和嵌套数组