Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python如何关闭线程中实例化的套接字?_Python_Multithreading_Python 2.7_Sockets - Fatal编程技术网

Python如何关闭线程中实例化的套接字?

Python如何关闭线程中实例化的套接字?,python,multithreading,python-2.7,sockets,Python,Multithreading,Python 2.7,Sockets,我有一个多线程程序,它实例化了5个套接字对象,如下所示: class myThread (threading.Thread): def __init__(self, pid, port_num, restart): threading.Thread.__init__(self) self.hostname = '127.0.0.1' self.pid = pid self.port_num = port_num

我有一个多线程程序,它实例化了5个套接字对象,如下所示:

class myThread (threading.Thread):
    def __init__(self, pid, port_num, restart):
        threading.Thread.__init__(self)
        self.hostname = '127.0.0.1'
        self.pid = pid
        self.port_num = port_num
        self.ID = pid
        self.restart = restart
        self.delay = pid*4*1000

    def run(self):
        try:
            s = timer(self.hostname, self.port_num, self.pid)
            #print "Socket S run"+str(s)
            sendToSocket(self.pid, s, self.t, self.ID)
        except Exception as e:
            raise
这里,函数
timer
用于按以下方式实例化线程:

def timer(host, port, pid):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)      
    timed = pid * 4 * 100
    s.settimeout(timed)
    s.bind((host, port))
    s.listen(5)
    return s
我想在特定端口(比如5005)终止其中一个套接字。 上例中的pid从5001变为5005

我想关闭中间的一个插座-比如5005。

所以我用了这个方法:

s = socket.socket()
s.connect(('127.0.0.1', 5005))
s.close()
但是插座没有关上
我需要从外部函数调用上述过程


简而言之,如果有一个套接字绑定到端口5005,我想关闭该套接字并使其不可用,这样我们将得到一个
端口未找到异常。

您可以创建一个字典,其中端口为键,套接字为值

my_sockets = {}
然后在
run
timer
函数中添加该字典中的所有新套接字

def timer(host, port, pid):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)      
    timed = pid * 4 * 100
    s.settimeout(timed)
    s.bind((host, port))
    s.listen(5)
    my_sockets[port] = s  
    return s
最后,创建一个函数来关闭和删除该字典中的套接字

def close_socket(port):
    if port in my_sockets : 
        my_sockets[port].close()
        my_sockets.pop(port)

当您的
类myThread
持有
.port\u num
时,
myThread\u实例.s.close()
是否不工作?