【问题标题】:Python How to close a socket instantiated in a thread?Python如何关闭在线程中实例化的套接字?
【发布时间】:2017-04-17 06:18:05
【问题描述】:

我有一个多线程程序,它实例化 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()

但是 Socket 没有关闭。
我需要从外部函数调用上述过程。

简而言之,如果有一个套接字绑定到端口 5005,我想关闭该套接字并使其不可用,以便我们得到一个Port not found exception.

【问题讨论】:

标签: python multithreading python-2.7 sockets


【解决方案1】:

您可以制作一个字典,将端口作为键,将套接字作为值。

my_sockets = {}

然后在 runtimer 函数中的字典中添加所有新套接字。

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)

【讨论】:

    猜你喜欢
    • 2013-05-20
    • 2015-11-02
    • 2017-09-22
    • 1970-01-01
    • 1970-01-01
    • 2019-01-07
    • 2018-04-29
    • 1970-01-01
    • 2011-11-10
    相关资源
    最近更新 更多