仅在Python套接字中接收数据(如果可用)

问题描述 投票:0回答:1

我只想在有可用数据的情况下接收数据。就像 Arduino 中的

Serial.available()
一样。我想要这样的代码:

if there is data:
     receive and print
else:
     print 'No data'

事实上,我不希望程序只是为了接收数据而停止。

python sockets tcp
1个回答
7
投票

您还可以在套接字上调用

.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>
© www.soinside.com 2019 - 2024. All rights reserved.