如何使用python识别与套接字的两个不同连接?

时间:2013-03-05 09:32:38

标签: python sockets

我先环顾四周,但找不到任何可以回答我问题的内容。

问题在于我正在制作一个小聊天程序。在看完一些教程并遵循一些文档之后,我设法制作了一个类似的聊天程序:

我有一个客户端和一个客户端/服务器。客户端/服务器基本上将自己设置为服务器,也可以回复客户端。

因此,它会侦听用户识别的某个端口,然后接受客户端连接。

问题在于我决定将这一切都改变一下。

而不是拥有客户端/服务器。我想要两个客户端和一个充当两个客户端之间的交换机的服务器。基本上将所有聊天指向连接的地址。

这是我有点难过的地方:

HOST = input("Please define the host IP, if over local, name 'localhost': ")
PORT = int(input("Please define the port to be communicated over: "))
if PORT == False:
    PORT = 4010


s = socket(AF_INET,SOCK_STREAM)#AF_INET and SOCK_STREAM are standard. 
s.bind((HOST,PORT))# The socket is being bound, or assigned, the ip of the server, as well as the communicating port.
s.listen(2)#Accepting only a single connection. EDIT: Now two connections.
conn,addr = s.accept()


print("\nNetwork activity from address: ",addr,)

# Section two: Communications Loop.

问题是s.listen(2)已被编辑为接受2个连接,但是我应该如何管理连接的不同连接,或者为它们分配变量以便我可以让交换机工作?

如果你发现这是一个重复的帖子,请发布链接,我会看看是否可以删除这个,然后先阅读。 (对不起,我在这之前发布了很糟糕的经历,(由于我没有得到的原因而被投票))

1 个答案:

答案 0 :(得分:0)

listen参数告诉您可以挂起的连接数,而不是接受的连接数。

您必须使用select模块,它允许您插入文件描述符列表并检查哪些文件描述符已准备好输入或输出。

然后你会有一个打开的连接列表(最初是空的),再加上套接字s,要传递给select,那么你应该读取数据,将它写入所有其他连接,然后永远循环。

import select

connections = []

while True:
    rlist,wlist,xlist = select.select(connections + [s],[],[])
    for i in rlist:
        if i == s:
            conn,addr = s.accept()
            connections.append(conn)
            continue
        data = i.recv(1024)
        for q in connections:
            if q != i and q != s:
                q.send(data)

此代码没有考虑使用非阻塞模式的复杂性,因此一个慢速客户端也会减慢所有其他客户端的速度,但通常它应该可以工作。