2016-07-26 19 views
3
sock.setblocking(0) 
ready = select.select([sock], [], [], timeout) 
try: 
    if ready[0]: 
     status = sock.recv(1024) 
     return status 
    else: 
     print "Time out Occured, Disconnecting..." 

クライアント側で何らかのステータスが変更されたときに受信するソケット受信機能を持っています。一方、私は他の活動を処理します。ソケット(Python)で最新の通知を受け取る方法

私は受け取ることができず、受け取ることができないいくつかの他の活動の間に靴下を受け取ります。

私はいつでも最新の受信を得ることができます!

pythonの初心者ですのでご注意ください。

+0

どのようなタイプのソケットは 'sock'ですか? *受信していない(またはむしろパケットが欠落している)という概念全体がデータグラムソケットのためだけに意味があるからです... – dhke

+0

socket.AF_INET、socket.SOCK_STREAMで作成されたソケット – taz

+0

あなたは* *を受け取る? 'SOCK_STREAM'はあなたに逐次配送を保証しますので、データを忘れることはできません。データは、非ブロッキングIOであっても、あなたがアクセスしていない間に接続が壊れていない限り、ソケットバッファーであなたを待っていますが、適切なエラーメッセージが表示されます。 – dhke

答えて

0

あなたが背景IOが必要な場合は、IOを処理する新しいスレッドを生成することは、おそらく最も簡単な方法です:

import socket 
import threading 
import queue 

class ClientReceiver(threading.Thread): 
    RECV_BUF_SIZE = 1024 
    QUEUE_SIZE = 2 

    def __init__(self, sock, recv_buf_size=None, queue_size=None, *args, **kwargs): 
     super(ClientReceiver, self).__init__(*args, **kwargs) 
     # set thread as daemon thread, we don't want to 
     # wait for this thread on interpreter exit. 
     self.setDaemon(True) 
     self.sock = sock 
     self.recv_buf_size = recv_buf_size or self.RECV_BUF_SIZE 
     self.queue_size = queue_size or self.QUEUE_SIZE 

    def run(self): 
     sock = self.sock 
     try: 
      while True: 
       data = sock.recv(self.recv_buf_size) 
       self.queue.put(data)    
     except Exception as ex:  
      # handle errors  
      raise 

# Usage example: 
sock = ... 
receiver = ClientReceiver(sock)       
receiver.start() 
data = receiver.queue.get(block=False) 

スレッドはすぐにそれが利用可能であり、キューに格納しますように、ネットワークからデータを取得します。キューがいっぱいになるとスレッドがブロックされ、別の戦略が必要なのかもしれません。

いつでもキューからデータを取得するには、receiver.queueを使用します。

これは適切なクライアントソケットシャットダウンのコードがありませんが、おそらく基本的な考え方が得られます。

+0

属性エラーの取得:キューインスタンスには属性__trunc__がありません。 – taz

+0

@tazあなたはこの行をどの行から取得していますか?どのバージョンのPythonを使用していますか? – dhke

関連する問題