2017-03-31 105 views
0

我正在使用python編寫一個messenger應用程序,並且遇到問題。問題很簡單:我希望程序只發送來自另一臺計算機的數據,否則,我的程序會無限等待數據傳輸。我會如何編寫這段代碼?我想這會是這樣的:僅當發送python套接字時才接收數據

try: 
     data = s.recv(1024).decode() 
    except: 
     data == None 

回答

2

select模塊。一個套接字可以通過超時進行監控,以便進行其他過程。

實例的服務器:

import socket 
import select 

with socket.socket() as server: 
    server.bind(('',5000)) 
    server.listen(3) 
    to_read = [server] # add server to list of readable sockets. 
    clients = {} 
    while True: 
     # check for a connection to the server or data ready from clients. 
     # readers will be empty on timeout. 
     readers,_,_ = select.select(to_read,[],[],0.5) 
     for reader in readers: 
      if reader is server: 
       client,address = reader.accept() 
       print('connected',address) 
       clients[client] = address # store address of client in dict 
       to_read.append(client) # add client to list of readable sockets 
      else: 
       # Simplified, really need a message protocol here. 
       # For example, could receive a partial UTF-8 encoded sequence. 
       data = reader.recv(1024) 
       if not data: # No data indicates disconnect 
        print('disconnected',clients[reader]) 
        to_read.remove(reader) # remove from monitoring 
        del clients[reader] # remove from dict as well 
       else: 
        print(clients[reader],data.decode()) 
     print('.',flush=True,end='') 

一個簡單的客戶端,假設您的IP地址爲1.2.3.4。

import socket 
s = socket.socket() 
s.connect(('1.2.3.4',5000)) 
s.sendall('hello'.encode()) 
s.close() 
+0

這會允許其他網絡上的設備連接到服務器還是隻連接到服務器網絡中的設備?如果第二,客戶端需要什麼服務器的地址? – ChrisCroissant

+0

@Chris這取決於你的網絡。例如,如果您位於家庭路由器後面,則需要打開防火牆上的端口以供Internet用戶訪問。 'server.bind(('',5000))'會讓任何人連接,假設有一個網絡路由。 –

+0

那麼會怎樣,例如。我的朋友,需要連接到5000端口? – ChrisCroissant