我在理解python套接字编程的代码时遇到麻烦

时间:2019-06-30 18:26:17

标签: python sockets

我是套接字领域的初学者,最近尝试用它创建一个终端聊天应用程序。我仍然很难理解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()

1 个答案:

答案 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大部分时间都是可写的,因此导致繁忙的循环。