1

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

问题是我正在制作一个小聊天程序。在观看了一些教程并遵循了一些文档之后,我设法制作了一个像这样工作的聊天程序:

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

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

问题是我决定我想改变这一切。

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

这是我有点难过的地方:

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 个连接,但是我应该如何管理不同的连接连接,或者为它们分配变量,以便我可以让交换机工作?

如果你发现这是一个重复的线程,请发布链接,我会看看我是否可以删除这个并先去那里阅读。(抱歉,我之前在这里发帖的经历很糟糕,(因为我不明白的原因投了反对票))

4

1 回答 1

0

listen 参数告诉你有多少连接可以挂起,而不是有多少将被接受。

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

然后你会有一个打开的连接列表(最初是空的),加上 socket 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)

这段代码没有考虑使用非阻塞模式的复杂性,所以一个慢客户端也会减慢所有其他客户端,但总的来说它应该可以工作。

于 2013-03-05T09:43:55.393 回答