2012-02-16 10 views
3

私はPythonでいくつかのハードウェアインタフェースを設計しています。私は何をする必要があることは、次のように、Pythonソケットプログラミング - 接続をリッスンしながら何かをする必要があります

~~~デバイス を開始ポート2626でソケットを作成し、クライアントが任意のクライアントがハローを送り、その後接続してしまった場合は、データ 〜を受信するために接続するために待つドライバー を初期化しています接続されている他のすべてのクライアントにサービスを提供し、このクライアントを接続されたクライアントリストに追加します。 〜デバイスで何らかのイベントが発生した場合、温度上昇が検出され、このイベントデータを通じて接続されているすべてのクライアントに通知されます。 〜接続されているクライアントは、サーバーに特定のデータを要求できます。

これは私のプロセスです。私はデバイスのパーツを今すぐ素晴らしいものにして、コンソールへの印刷データを得ました。そして、ソケットサーバーのために、私は次のコードをこのようにうまく動作します。 しかし、問題は、whileループ内で "run()"を呼び出した後です。その明らかな。私が新しい接続を聞いているとき、私は他の機能を呼び出すことができません。

接続を聞いているうちに/ recvを送信できるはずです。どのようにこれを行うにはどのようなアイデア?

これは、接続を待機するために正常に動作している私のサーバープログラムです。聞いている間はあなたは何にも許されません。 :(

#!/usr/bin/env python 

import socket 
import select 

class ChatServer: 

    def __init__(self, port): 
     self.port = port; 

     self.srvsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     self.srvsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
     self.srvsock.bind(("", port)) 
     self.srvsock.listen(5) 

     self.descriptors = [self.srvsock] 
     print 'Server started on port %s' % port 

    def run(self): 
     while 1: 
      # Await an event on a readable socket descriptor 
      (sread, swrite, sexc) = select.select(self.descriptors, [], []) 
      # Iterate through the tagged read descriptors 
      for sock in sread: 
       # Received a connect to the server (listening) socket 
       if sock == self.srvsock: 
        self.accept_new_connection() 
       else: 
        # Received something on a client socket 
        str = sock.recv(100) 

        # Check to see if the peer socket closed 
        if str == '': 
         host,port = sock.getpeername() 
         str = 'Client left %s:%s\r\n' % (host, port) 
         self.broadcast_string(str, sock) 
         sock.close 
         self.descriptors.remove(sock) 
        else: 
         host,port = sock.getpeername() 
         newstr = '[%s:%s] %s' % (host, port, str) 
         self.broadcast_string(newstr, sock) 

    def accept_new_connection(self): 
     newsock, (remhost, remport) = self.srvsock.accept() 
     self.descriptors.append(newsock) 

     newsock.send("You're connected to the Python server\r\n") 
     str = 'Client joined %s:%s\r\n' % (remhost, remport) 
     self.broadcast_string(str, newsock) 

    def broadcast_string(self, str, omit_sock): 
     for sock in self.descriptors: 
      if sock != self.srvsock and sock != omit_sock: 
       sock.send(str) 
     print str, 

myServer = ChatServer(2626).run() 

すべてのあなたの助けを事前に感謝:)

+1

[Twisted](http://twistedmatrix.com/trac/)を使用しますか? –

+0

@MikeCooperあなたの提案バディに感謝します。私はPythonの初心者です。サンプルがありますか、クイックスタートのためのチュートリアルを指すことができますか? – san

答えて

1

ねじれが問題ではないので、socketserverモジュールを使用することをおすすめします。

簡単に開始するには、exampleをご覧ください。

+0

あなたの提案に感謝します。 socketServerでこれを動作させました。 :) – san

1

あなたはすべてのソケットnon-blockingを作成する必要があります。

+0

私は再び同じ問題を非ブロッキングしようとしました。 – san

+0

@Sanソケット(サーバーソケットも)を非ブロックにすると、提供したコードに問題はありません。 –

+0

私もそれを試みました。あなたのリファレンスのためにnodejsスクリプトからこれに接続しています。 nodejsはそのようにうまくいっています。私はwhileループを取り除く必要があります。その私のプログラムを停止します。 – san

1

使用Twisted

コアパイソン非同期ネットワークがhereで示す例。

+0

...または 'socketserver'(Python 2.xの' SocketServer') – Kimvais

+0

@Kimvaisあなたはねじれを使わずに話していますか?私は先週のpythonだけで始めました。あなたがいくつかのサンプルを指すことができるなら、私はあなたにもっと感謝します。 – san

+0

@サン - ねじれを使用できない_external_制限がない場合は使用してください。 [チュートリアル](http://twistedmatrix.com/documents/current/core/howto/tutorial/index.html)は良いスタートです。 – Kimvais

関連する問題