2

Python とネットワーク プログラミングの知識があまりありません。現在、ユーザーから送信されたテキスト メッセージを受信し、Google 検索 API から情報を取得し、結果をテキスト メッセージでユーザーに返すことができる単純なアプリケーションを実装しようとしています。このアプリケーションは、ユーザーのメッセージをリッスンし続け、すぐに返信します。

ユーザーから送信されたテキストショートメッセージを取得するにはどうすればよいですか? これは、中国のモバイル サプライヤーが提供する fetion という名前のプログラムです。クライアント側の機能は、インスタント コミュニケーション ツールのように、モバイルを使用して SMS を送受信している他のユーザーとの間でメッセージを送受信できます。

fetion プログラムをシミュレートするオープン ソースの python プログラムを使用しています。基本的に、この python プログラムを使用して、SMS 経由で携帯電話を使用している他のユーザーと通信できます。

私のコア プログラムは Java に基づいているため、この Python プログラムを Java 環境に取り込む必要があります。私はjythonを使用していますが、Javaコードのいくつかの行でユーザーにメッセージを送信できるようになりました.

しかし、本当の問題は、SMS を介してユーザーから受信するプロセスです。Python コードでは、新しいスレッドが作成され、ユーザーを継続的にリッスンします。Python では問題ないはずですが、Jython で同様のプロセスを実行すると、次の例外が発生します。

Exception in thread Thread:Traceback (most recent call last):
File "D:\jython2.5.1\Lib\threading.py", line 178, in _Thread__bootstrap
   self.run()
File "<iostream>", line 1389, in run
File "<iostream>", line 1207, in receive
File "<iostream>", line 1207, in receive
File "<iostream>", line 150, in recv
File "D:\jython2.5.1\Lib\select.py", line 223, in native_select
  pobj.register(fd, POLLIN)
File "D:\jython2.5.1\Lib\select.py", line 104, in register
  raise _map_exception(jlx)
error: (20000, 'socket must be in non-blocking mode')

Python コードの 150 行目は次のとおりです。

def recv(self,timeout=False):
    if self.login_type == "HTTP":
        time.sleep(10)
        return self.get_offline_msg()
        pass
    else:
        if timeout:
            infd,outfd,errfd = select([self.__sock,],[],[],timeout)//<---line 150 here
        else:
            infd,outfd,errfd = select([self.__sock,],[],[])

        if len(infd) != 0:
            ret = self.__tcp_recv()

            num = len(ret)
            d_print(('num',),locals())
            if num == 0:
                return ret
            if num == 1:
                return ret[0]
            for r in ret:
                self.queue.put(r)
                d_print(('r',),locals())

            if not self.queue.empty():
                return self.queue.get()

        else:
            return "TimeOut"

私はPython、特にソケット部分に精通しておらず、Jythonの使用も初めてなので、本当にあなたの助けが必要か、アドバイスや説明だけが必要です.

どうもありがとうございました!

4

2 に答える 2

2

jython select ドキュメント ページに記載されているように、非ブロッキング モードのソケットのみが jython で多重化できます。これは、cpython とは対照的に、ソケットはブロッキングまたはノンブロッキングのいずれかになります。

http://wiki.python.org/jython/SelectModule#Onlysocketsinnon-blockingmodecanbemultiplexed

これは、jython が何も変更できない Java の制限です。

jython select モジュールには、まさにこの状況に対応する特別な関数 cpython_compatible_select 関数があります。

上記のコードではselectモジュールのインポートを示していませんが、私が見たものに基づいて、このようなインポートを行っている必要があります

from select import select

そのインポートをこれに置き換えると

from select import cpython_compatible_select as select

その後、すべてが正常に機能するはずです。

最後に、選択モジュールのドキュメント ページの「警告」セクションを必ずお読みください。

于 2010-04-01T15:23:57.513 に答える
1

selectこのエラーは、 (デフォルトで) 入力待ちをブロックするように設定されているソケットで呼び出そうとしたことを示しています。ノンブロッキングにする移植可能な方法は、self.__sockが作成された場所を見つけて、その上でsocket.setblocking(0)を呼び出すことです。

原則として、選択呼び出しの前に呼び出すことができますsetblockingrecv、読者を混乱させるでしょう。これらは低レベルのソケット ルーチンへの直接呼び出しであるため、これは厳密には Python に関する質問ではなく、プラットフォームに適したソケットシステム コールの操作に関する質問です。

于 2010-03-28T13:44:05.437 に答える