首页 > 解决方案 > 我无法理解 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()

标签: pythonsockets

解决方案


如果data里面什么都没有,怎么说明socket已经断开了

recv()的 POSIX 规范说:

成功完成后,recv () 将返回消息的字节长度。如果没有消息可以接收并且对等体已经执行了有序的关闭,recv () 将返回 0。...

在 Python 接口中,返回值 0 对应于返回的长度为 0 的缓冲区,data.

什么会影响服务器或客户端中的 setblocking。

setblocking(0)套接字设置为非阻塞,即如果不能立即完成accept()recv()不能立即完成,则操作失败而不是阻塞直到完成。在给定的代码中,这几乎不会发生,因为在可能之前不会尝试操作(由于使用select())。然而,这个例子很糟糕,因为它包含outputselect()参数中,导致一个繁忙的循环,因为output大多数时间都是可写的。


推荐阅读