Python上的客户端Socket,如何联系多个服务器?

时间:2015-10-19 20:46:34

标签: python sockets server client

我有一个需要联系某些服务器的客户端。因此客户端上的套接字将连接到特定的服务器端口和主机,但是如何从一台服务器切换到另一台服务器呢?所以我的简易客户端看起来像:

import socket
import sys

class Client:

    def __init__(self):
        self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        if self.s is None:
            print('could not open socket')
            sys.exit(1)
        self.servers = { 1998: True, 1999: True }
        self.current_file = None
        self.host = '127.0.0.1'
        if len(sys.argv) > 1:
            self.host = sys.argv[1]

    def IterateServer(self):
        keys = self.servers.keys()
        for key in keys:
            try:
                self.s.connect((self.host, key))
            except socket.error as msg:
                self.servers[key] = False
                continue
            print('Connect' + str(key))

我的问题是关于IterateServer(self)

当我设置套接字连接时,它适用于第一台服务器(端口1998),但不适用于第二台服务器。我认为当我将套接字连接到另一个时,我无法重新连接它,我是对的吗?

1 个答案:

答案 0 :(得分:1)

我的策略是拥有一个字典,将服务器映射到使用该服务器打开的套接字。

我用None进行初始化,表示没有套接字在那里打开。

self.servers = { 1998: None, 1999: None }

然后,在循环中:

def IterateServer(self):
    for key in self.servers:
        try:
            tmp_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            tmp_sock.connect((self.host, key))
        except socket.error as msg:
            # Didn't work! Entry in dict stays as None
            continue
        # Did work! Update the dict with our open socket.
        self.servers[key] = tmp_sock
        print('Connect' + str(key))

现在您可以使用类似

的内容写入所有服务器
def write_to_all_servers(self, string_to_write):
    for key, sock in self.servers.items():
        if sock is not None:
            sock.write(string_to_write)