如何在等待接收数据时关闭阻塞套接字?

Ric*_*ard 4 python sockets networking

我有一个使用阻塞套接字来接收数据的服务.我遇到的问题是,如果仍在等待数据,我不知道如何正确关闭套接字.下面是我如何打开和等待数据的简短说明:我不想实现超时,因为根据python文档,套接字必须阻塞才能使用makefile.

因为我刚接触使用套接字进行编程,所以我可能会完全错误.

编辑:

应该注意的是,我无法改变服务器的运行方式.

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
reader = s.makefile("rb")
line = reader.readline()
Run Code Online (Sandbox Code Playgroud)

Dav*_*net 5

有一个非常简单的解决方案.给定一个套接字和一个reader文件对象rfile = socket.makefile('rb'),为了rfile.readline()在套接字关闭时立即返回,你需要在一个单独的线程中执行以下命令:

socket.shutdown(socket.SHUT_RDWR)
socket.close()
Run Code Online (Sandbox Code Playgroud)

调用socket.shutdown()将使rfile.readline()返回为空strbytes取决于Python的版本(分别为2.x或3.x).


Céd*_*ien 2

关闭此套接字的一种解决方案是要求服务器关闭它。

如果服务器关闭客户端套接字,客户端将收到“连接被对等方重置”错误,并且可能会中断阻塞接收。

另一个解决方案是不使用readline()套接字并设置超时(无限期等待可以等待......无限期)