我是套接字领域的初学者,最近尝试用它创建一个终端聊天应用程序。我仍然很难理解setblocking和选择功能
“这是我从一个我正在读取的网站中获取的代码,如果数据中没有任何内容,这意味着该套接字已断开连接,请同时说明对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()
答案 0 :(得分:0)
如果数据中没有任何内容,这意味着套接字已断开连接
recv()的POSIX规范说:
成功完成后, recv ()将返回消息的长度(以字节为单位)。如果没有消息可用 收到并且对等方已执行有序的关闭, recv ()将返回0。
在Python接口中,返回值0对应于长度为0(即i)的返回缓冲区。 e。 data
中什么都没有。
什么会影响服务器或客户端中的setblocking。
setblocking(0)
将套接字设置为非阻塞,即。 e。如果e。 G。 accept()
或recv()
无法立即完成,该操作失败而不是阻塞直到完成。在给定的代码中,几乎不会发生这种情况,因为在可能的操作之前并没有尝试过这些操作(由于使用了select()
)。但是,该示例很糟糕,因为它在output
参数中包含select()
,由于output
大部分时间都是可写的,因此导致繁忙的循环。