Python - 如何检查套接字是否仍然连接
Python - How to check if socket is still connected
我有以下代码,不言自明:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(host, port)
s.send("some data")
# don't close socket just yet...
# do some other stuff with the data (normal string operations)
if s.stillconnected() is true:
s.send("some more data")
if s.stillconnected() is false:
# recreate the socket and reconnect
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(host, port)
s.send("some more data")
s.close()
我如何实施 s.stillconnected()
我不想盲目地重新创建套接字。
如果服务器连接不再存在,调用send方法会抛出异常,所以你可以使用try-exception块来尝试发送数据,如果抛出异常则捕获异常,并重新建立连接:
try:
s.send("some more data")
except:
# recreate the socket and reconnect
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(host, port)
s.send("some more data")
编辑:根据@Jean-Paul Calderone 的评论,请考虑使用 sendall
方法,这是发送所有数据或抛出的更高级别的方法一个错误,而不是 send
,这是一个较低级别的方法,不能保证所有数据的传输,或者使用更高级别的模块,如可以处理套接字生命周期的 HTTP 库。
我用这个变体检查套接字是否关闭(如果你想检查它是否仍然连接,则否定结果)得到了很好的结果:
import logging
import socket
logger = logging.getLogger(__name__)
def is_socket_closed(sock: socket.socket) -> bool:
try:
# this will try to read bytes without blocking and also without removing them from buffer (peek only)
data = sock.recv(16, socket.MSG_DONTWAIT | socket.MSG_PEEK)
if len(data) == 0:
return True
except BlockingIOError:
return False # socket is open and reading from it would block
except ConnectionResetError:
return True # socket was closed for some other reason
except Exception as e:
logger.exception("unexpected exception when checking if a socket is closed")
return False
return False
我有以下代码,不言自明:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(host, port)
s.send("some data")
# don't close socket just yet...
# do some other stuff with the data (normal string operations)
if s.stillconnected() is true:
s.send("some more data")
if s.stillconnected() is false:
# recreate the socket and reconnect
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(host, port)
s.send("some more data")
s.close()
我如何实施 s.stillconnected()
我不想盲目地重新创建套接字。
如果服务器连接不再存在,调用send方法会抛出异常,所以你可以使用try-exception块来尝试发送数据,如果抛出异常则捕获异常,并重新建立连接:
try:
s.send("some more data")
except:
# recreate the socket and reconnect
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(host, port)
s.send("some more data")
编辑:根据@Jean-Paul Calderone 的评论,请考虑使用 sendall
方法,这是发送所有数据或抛出的更高级别的方法一个错误,而不是 send
,这是一个较低级别的方法,不能保证所有数据的传输,或者使用更高级别的模块,如可以处理套接字生命周期的 HTTP 库。
我用这个变体检查套接字是否关闭(如果你想检查它是否仍然连接,则否定结果)得到了很好的结果:
import logging
import socket
logger = logging.getLogger(__name__)
def is_socket_closed(sock: socket.socket) -> bool:
try:
# this will try to read bytes without blocking and also without removing them from buffer (peek only)
data = sock.recv(16, socket.MSG_DONTWAIT | socket.MSG_PEEK)
if len(data) == 0:
return True
except BlockingIOError:
return False # socket is open and reading from it would block
except ConnectionResetError:
return True # socket was closed for some other reason
except Exception as e:
logger.exception("unexpected exception when checking if a socket is closed")
return False
return False