我仍然对知道我的套接字连接的状态感到困惑。这就是我正在做的。
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect(("127.0.0.1",9979))
while True:
msg = client.recv(4096)
processNotificationMessage(msg)
time.sleep(0.1)
Run Code Online (Sandbox Code Playgroud)
我想连接到服务器并永远接收数据。但是我怎么知道我的客户端连接是否由于某种原因关闭了?
通过谷歌搜索,我发现client.recv()将返回一个空字符串或client.recv()将引发异常(但是当我停止服务器时没有异常)。但是如果服务器本身有时发送一个空字符串怎么办?如果我尝试通过检查空字符串来重新连接,它会抛出一个异常,说已经连接。这里的解释(如何判断 python 中的连接是否已死)对我不起作用。
当我重新启动服务器时,客户端没有收到任何数据。
omg*_*unk 12
fileno() 将为关闭的套接字返回 -1。
cli, addr = self.sock.accept()
print(cli.fileno())
cli.close()
print(cli.fileno())
Run Code Online (Sandbox Code Playgroud)
输出
376
-1
Run Code Online (Sandbox Code Playgroud)
来自文档18.1 - Socket
socket.fileno() 返回套接字的文件描述符(一个小整数),失败时返回 -1。这对 select.select() 很有用。
从技术上讲,套接字也是一个列表,您可以通过它找到 [closed] 标签
cli, addr = self.sock.accept()
for i in str(cli).split():
print(i)
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)<socket.socket fd=488, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('10.1.1.2', 80), raddr=('10.1.1.2', 16709)> 488 -1
cli.close()
for i in str(cli).split():
print(i)
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)<socket.socket fd=504, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('10.1.1.2', 80), raddr=('10.1.1.2', 16833)> 504 <socket.socket [closed] <--- fd=-1, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0> -1
client.recv可以返回空字符串的唯一方法是在文件末尾(即服务器端消失了)。
不可能通过SOCK_STREAM连接发送零长度消息。如果服务器想要发送一个空字符串,它需要发送一些其他指示符(例如,C 风格的空字符串实际上是一个仅包含一个零字节的单字节字符串——空终止符)。
如果你的服务器真的停止了,你应该得到一个空字符串。你确定你没有?上面显示的循环没有检查该条件。如果服务器以显示的代码停止,您将简单地坐在循环中,接收一个零字节字符串,processNotificationMessage使用(空)字符串调用,休眠十分之一秒,然后返回接收另一个零字节字符串,无止境。您需要检查条件和break循环 ( if not msg: break)。
| 归档时间: |
|
| 查看次数: |
27031 次 |
| 最近记录: |