【问题标题】:maintain multiple socket connections while putting the recv through a single handler in python维护多个套接字连接,同时将 recv 通过 python 中的单个处理程序
【发布时间】:2013-08-24 11:04:05
【问题描述】:

我有一个函数可以返回特定站点的主机。并使用这两个功能

def connect(self, rooms):
    print('')
    i = [x for x in rooms]
    for x in i:
        self.room_connect(x)
    running = True            
    while running:
        self.event_data()`

def room_connect(self, rooms):
    host = getServer(rooms)
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect((host, 443)) 
    sock.send(self.room_auth(rooms).encode())
    self.sockets = sock
    print(self.sockets)
    print('connected to '+ rooms)
    self.postbyte = True 

我能够为每个主机连接到不同的套接字。问题是,我需要它来保持与它连接的每个套接字的连接。最后,只维护在 for 循环中创建的最后一个套接字。来自该套接字的套接字接收数据被传递给处理程序以解析信息。基本上我要问的是如何保持与for循环中创建的每个套接字的连接,同时将其recv信息传递给处理程序。处理程序是 event_data(),在 event_data 函数中,要解析的数据由 data = self.sockets.recv(1024) 定义。问题是 for 循环中唯一的最后一个套接字需要处理。

【问题讨论】:

  • 如果您也显示类定义的其余部分,这将有所帮助。很难准确地说出您的不同变量在做什么。 self.sockets 可能是最有趣的,但所有这些(从这段代码中引用)都会很好。
  • self.sockets = None 在类下的init

标签: python sockets networking host


【解决方案1】:

把它放在字典里。然后,您可以在将来轻松查找它。

【讨论】:

  • 我需要让它保持连接到它创建的每个套接字
  • @user2602977 将其放入字典后,您的套接字对象将保留,因此您的连接将保持打开状态——您实际上也可以引用它。
【解决方案2】:

我同意 xaxxon 的做法。将连接(socket fds)放入队列中(基于“host”的值作为键)。但是,如果您希望 event_data 从各种套接字接收数据,那么您可能需要额外的机制,因为 recv() 调用是阻塞的,并且如果您有多个主机,这可能是一个问题。您可能需要使用 select() 或多线程或两者兼而有之。

【讨论】:

  • 我以前见过这样使用 select 虽然我自己不知道如何使用它。我现在通过将套接字放在字典self.socks = list(self.sockets.values()) 中来连接和维护连接,尽管就像你说的那样,recv 只从最新的连接中获取信息(列表中的最后一个套接字)
  • 使用 select(),我们可以传递多个文件描述符 (fds),当我们在它们上获得任何事件时,select() 调用返回并设置具有事件的 fd;文件描述符是 socket() 调用的返回值,并且是代码中的 sock 变量。因此,在返回时,我们可以检查 fd 设置了什么,然后对其发出 recv() 调用(假设我们正在检查读取事件)。这样,使用 select,我们只有一个阻塞调用,而不是为每个 fds 执行阻塞 recv() 调用。您可能会觉得这很有帮助:docs.python.org/2/library/select.html
  • @user2602977 您需要实际发布所有相关代码。如果您要根据更改提出其他问题,则需要使用新代码更新您的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多