我在python中有一个多线程程序,我想在CTRL + C(或Z)之后关闭套接字。我已经尝试了this和this,但没有一个有效。
尝试重新运行程序时,会显示错误消息:
绑定失败。错误代码:98已在使用的消息地址被调用 回溯(最近一次呼叫最后一次):文件" main.py",第16行,in main.connection.close()NameError:name' main'未定义
from connection import Connection
class Main():
def __init__(self):
self.connection = Connection()
self.connection.start()
if __name__ == '__main__':
try:
main = Main()
except:
main.connection.close()
import socket
import sys
import threading
import time
class Connection(threading.Thread):
def __init__(self, group=None, target=None, name=None, args=(), kwargs=None, verbose=None):
threading.Thread.__init__(self, group=group, target=target, name=name, args=args, kwargs=kwargs, verbose=verbose)
self.server = None
self.connection = self.start_connention()
self.data = "null"
self.lock = threading.Lock()
self.OK = True
def start_connention(self):
host = '192.168.42.1'
port = 8888
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
print 'Socket created'
#Bind socket to local host and port
try:
s.bind((host, port))
except socket.error, msg:
print 'Bind failed. Error code: ' + str(msg[0]) + ' Message ' + msg[1]
sys.exit()
print 'Socket bind complete'
#Start listening on socket
s.listen(10)
print 'Socket now listening on ' + str(port)
connection, addr = s.accept()
print 'Connected with ' + addr[0] + ':' + str(addr[1])
self.server = s
return connection
def close(self):
print("closing")
self.OK = False
self.server.close()
def run(self):
while self.OK:
with self.lock:
self.data = self.connection.recv(4096)
print(str(self.data))
time.sleep(0.02)
def send(self, message):
self.connection.sendall(message)
答案 0 :(得分:0)
来自docs:KeyboardInterrupt继承自BaseException,以免被捕获Exception的代码意外捕获,从而阻止解释器退出。 docs
if __name__ == '__main__':
try:
main = Main()
except KeyboardInterrupt:
pass
finally:
main.connection.close()
答案 1 :(得分:-1)
我建议您使用atexit
模块来处理这些内容。
只需将此行放在__init__
中,以防任何python进程终止,连接将关闭
atexit.register(self.close)