Python 如何在除KeyboardInterrupt:在类之外时使用sock.close()正常关闭套接字
给定这部分代码,当按下Ctrl+C时,程序返回错误“未定义名称'sock'。我想这是正常的,因为Python 如何在除KeyboardInterrupt:在类之外时使用sock.close()正常关闭套接字,python,sockets,Python,Sockets,给定这部分代码,当按下Ctrl+C时,程序返回错误“未定义名称'sock'。我想这是正常的,因为sock.close()在类之外,但是我应该怎么做来防止它呢 在我的例子中,请求套接字关闭的是客户机,而不是服务器 import socket class something(object): def connect(self): self.sock = socket.socket( socket.AF_INET, socket.SOCK_STREAM) se
sock.close()
在类之外,但是我应该怎么做来防止它呢
在我的例子中,请求套接字关闭的是客户机,而不是服务器
import socket
class something(object):
def connect(self):
self.sock = socket.socket( socket.AF_INET, socket.SOCK_STREAM)
self.sock.connect((self.tcp_ip, self.tcp_port))
# etc.
if __name__ == '__main__':
try:
app = something()
app.connect()
except KeyboardInterrupt:
pass
finally:
sock.close()
试试这个
if __name__ == '__main__':
try:
foo = something()
foo.connect()
except KeyboardInterrupt:
pass
finally:
foo.sock.close()
我想这应该行得通
import socket
class something(object):
def __init__(self):
self.sock = None
def connect(self):
self.sock = socket.socket( socket.AF_INET, socket.SOCK_STREAM)
self.sock.connect(('127.0.0.1', 12397))
self.sock.recv(1024)
def close(self):
self.sock.close()
if __name__ == '__main__':
try:
sk = something()
sk.connect()
except KeyboardInterrupt:
pass
finally:
sk.close()
print "Socket Closed"
为了很好地关闭与
信号的连接,可以使用捕捉键盘中断:
#!/usr/bin/env python3
""" testsocketclose.py """
import signal, socket, sys, time
def handler(signum, frame):
""" Catch <ctrl+c> signal for clean stop"""
print('\nNice exit')
connection.close()
sys.exit(0)
signal.signal(signal.SIGINT, handler)
connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
connection.bind(('localhost', 5555))
connection.listen(5)
while 1:
print("Socket open:\n{}\nExit with <ctrl+c>".format(connection))
time.sleep(2)
#/usr/bin/env蟒蛇3
“”“testsocketclose.py”“”
输入信号,插座,系统,时间
def处理器(信号、帧):
“”“清洁停止的捕捉信号”“”
打印(“\n即时退出”)
连接。关闭()
系统出口(0)
signal.signal(signal.SIGINT,handler)
连接=socket.socket(socket.AF\u INET,socket.SOCK\u流)
bind(('localhost',5555))
连接。听(5)
而1:
打印(“套接字打开:\n{}\nExit with.”格式(连接))
时间。睡眠(2)
上述代码中的某物()
的可能重复项将永远不会创建套接字。是否有更多您认为不相关的代码?请包括:)。@-好的,我遗漏了一些东西,谢谢你的指点(我应该在睡眠后才学会在这里发布:)虽然在这个制造的示例中不太可能,但如果键盘中断
在调用.connect()
之前出现,这仍然会引发异常。是的,这是公平的。但是,使用键盘中断来关闭套接字可能不是最好的开始。它是由代码组成的,但我认为这样做的目的是允许Ctrl+C
用于退出程序或其中的一部分,OP希望关闭套接字。我认为这个问题仍然适用于任何其他信号发送方法。当我阅读OP的问题时,我会将其解释为:我如何防止“此代码中未定义名称‘sock’?我想我可能误解了这个问题。是的,这很有效,也是我学习更好地使用类的一个好例子。如果我在类中有一个close
函数,在try
下有一个单独的main()
函数,会怎么样?