我只想在有可用数据的情况下接收数据。就像 Arduino 中的
Serial.available()
一样。我想要这样的代码:
if there is data:
receive and print
else:
print 'No data'
事实上,我不希望程序只是为了接收数据而停止。
您还可以在套接字上调用
.setblocking(False)
来禁用阻塞模式。当调用否则会阻塞时,它将引发 BlockingIOError
。但是,当您在套接字上 .accept()
或 .recv()
并且没有准备好连接或没有数据可接收时,您必须处理异常。例如:
try:
data = s.recv(1024)
print(data)
except BlockingIOError:
print('no data')
select.select
可用于轮询多个套接字以获取数据。这是一个简单的例子:
import socket
import select
server = socket.socket()
server.bind(('', 8000))
server.listen()
readables = [server] # list of readable sockets. server is readable if a client is waiting.
i = 0
while True:
# to_read will be a list of sockets with readable data
to_read, to_write, errors = select.select(readables, [], [], 0)
for sock in to_read: # iterate through readable sockets
if sock is server: # is it the server?
client, address = server.accept()
print(f'\r{address}: connected')
readables.append(client) # add the client
else:
# read from address client
data = sock.recv(1024)
if not data:
print(f'\r{sock.getpeername()}: disconnected')
readables.remove(sock)
sock.close()
else:
print(f'\r{sock.getpeername()}: {data}')
# a simple spinner to show activity
i += 1
print(r'/-\|'[i%4], end='\r', flush=True)
两个客户端连接、发送内容然后断开连接的示例:
('127.0.0.1', 2983): connected
('127.0.0.1', 2983): b'hello'
('127.0.0.1', 2985): connected
('127.0.0.1', 2985): b'there'
('127.0.0.1', 2983): disconnected
('127.0.0.1', 2985): disconnected
<spinner activity here>