2017-08-28 10 views
-1

利用可能な場合にのみデータを受信したい。 ArduinoのSerial.available()のように。利用可能であれば、pythonソケットでデータを受信する

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

実際には、データを受信するだけでプログラムを停止させたくありません。

+1

は、非ブロッキングソケットを使用するかを設定しますソケットのタイムアウト –

答えて

1

select.selectソケットにデータがあるかどうかをポーリングするために使用できます。ここでは簡単な例です:

import socket 
import select 
s = socket.socket() 
s.bind(('',8000)) 
s.listen(1) 
readable = [s] # list of readable sockets. s is readable if a client is waiting. 
i = 0 
while True: 
    # r will be a list of sockets with readable data 
    r,w,e = select.select(readable,[],[],0) 
    for rs in r: # iterate through readable sockets 
     if rs is s: # is it the server 
      c,a = s.accept() 
      print('\r{}:'.format(a),'connected') 
      readable.append(c) # add the client 
     else: 
      # read from a client 
      data = rs.recv(1024) 
      if not data: 
       print('\r{}:'.format(rs.getpeername()),'disconnected') 
       readable.remove(rs) 
       rs.close() 
      else: 
       print('\r{}:'.format(rs.getpeername()),data) 
    # a simple spinner to show activity 
    i += 1 
    print('/-\|'[i%4]+'\r',end='',flush=True) 

2つのクライアントが接続されて、何かを送信し、切断例:あなたが例外を処理する必要があり、その後

('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> 

あなたはまた、ソケット上.setblocking(0)を呼び出すことができますが、ときに.accept()かソケットの.recv()および受信への接続準備又は全くデータは、例えば、存在しない:

try: 
    data = s.recv(1024) 
    print(data) 
except BlockingIOError: 
    print('no data') 
関連する問題