2013-03-05 50 views
1

我環顧四周,但找不到任何答案來回答我的問題。如何使用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個連接,但我怎麼來管理不同的連接來連接,或將它們分配變量,這樣我可以讓交換機的東西工作?

如果你發現這是一個重複的線程,請發佈鏈接,我會看看我是否可以刪除這個,然後去那裏閱讀。 (對不起,我在這之前發過可怕的經歷,(因爲我沒有得到原因而被投票拒絕))

回答

0

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