如何使用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) 

此代码不会考虑使用非阻塞模式的帐户并发症,所以一个缓慢的客户端将所有其他客户端减缓了,但是总的来说它应该工作。

+0

我完全不知道如何执行此操作。任何教程或文档都可以指向我,这需要我做什么? – Micrified 2013-03-05 09:50:12

+0

我甚至写过一个代码示例! – LtWorf 2013-03-05 09:57:36

+0

Eugh。对此如何工作有点困惑。看起来你从一个最初为空的连接列表开始。 (因为我们没有连接)然后你有一个连续的循环,它执行以下操作:等待可读,等待可写,以及等待异常情况都将如下所示:Waiting Readable将会是[s],因为您在等待我们监听传入数据的套接字。另外两个是空的。现在我感到困惑的是'我'是什么,其余的工作如何。 – Micrified 2013-03-05 10:12:35