如何使用python标识两个不同的套接字连接?
问题描述:
我环顾四周,但找不到任何答案来回答我的问题。如何使用python标识两个不同的套接字连接?
问题是我正在制作一个小聊天程序。在看了一些教程和一些文档后,我设法创建了一个类似这样的聊天程序:
我有一个客户端和一个客户端/服务器。客户端/服务器基本上将自己设置为服务器,并且还可以回复客户端。
因此它侦听用户识别的某个端口,然后接受客户端连接。
问题是,我决定我想把这一切都改变一下。
而不是拥有客户端/服务器。我需要两台客户机和一台充当两台客户机之间交换机的服务器。基本上指导所有聊天到连接的地址。
这里就是我有点为难:
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个连接,但我怎么来管理不同的连接来连接,或将它们分配变量,这样我可以让交换机的东西工作?
如果你发现这是一个重复的线程,请发布链接,我会看看我是否可以删除这个,然后去那里阅读。 (对不起,我在这之前发过可怕的经历,(因为我没有得到原因而被投票拒绝))
答
listen参数告诉你有多少连接可以挂起,而不是多少将被接受。
您必须使用select模块,它允许您插入文件描述符列表并检查哪些文件已准备好输入或输出。
然后你将得到一个打开的连接列表(最初为空),再加上套接字s,然后你应该读取数据,将它写入所有其他连接,并永远循环。
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)
此代码不会考虑使用非阻塞模式的帐户并发症,所以一个缓慢的客户端将所有其他客户端减缓了,但是总的来说它应该工作。
我完全不知道如何执行此操作。任何教程或文档都可以指向我,这需要我做什么? – Micrified 2013-03-05 09:50:12
我甚至写过一个代码示例! – LtWorf 2013-03-05 09:57:36
Eugh。对此如何工作有点困惑。看起来你从一个最初为空的连接列表开始。 (因为我们没有连接)然后你有一个连续的循环,它执行以下操作:等待可读,等待可写,以及等待异常情况都将如下所示:Waiting Readable将会是[s],因为您在等待我们监听传入数据的套接字。另外两个是空的。现在我感到困惑的是'我'是什么,其余的工作如何。 – Micrified 2013-03-05 10:12:35