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)
有一个非常简单的解决方案.给定一个套接字和一个reader文件对象rfile = socket.makefile('rb')
,为了rfile.readline()
在套接字关闭时立即返回,你需要在一个单独的线程中执行以下命令:
socket.shutdown(socket.SHUT_RDWR)
socket.close()
Run Code Online (Sandbox Code Playgroud)
调用socket.shutdown()
将使rfile.readline()
返回为空str
或bytes
取决于Python的版本(分别为2.x或3.x).
关闭此套接字的一种解决方案是要求服务器关闭它。
如果服务器关闭客户端套接字,客户端将收到“连接被对等方重置”错误,并且可能会中断阻塞接收。
另一个解决方案是不使用readline()
套接字并设置超时(无限期等待可以等待......无限期)