2017-03-31 109 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