1

これまでのところ、(大きな) 成功なしで gevent を使用して TCP サーバーを作成しようとしています。問題は Windows 内にあると思います (以前に Windows のソケットで問題が発生したことがあります)。Windows7でPython2.7、gevent0.13を使用しています。これが私のコードです:

from gevent import socket
from gevent.server import StreamServer

def handle_echo(sock, address):
    try:
        fp = sock.makefile()
        while True:
            # Just echos whatever it receives
            try:
                line = fp.readline()
            except Exception:
                break
            if line:
                try:
                    fp.write(line)
                    fp.flush()
                except Exception:
                    break
            else:
                break
    finally:
        sock.shutdown(socket.SHUT_WR)
        sock.close()

server = StreamServer(("", 2345), handle_echo)
server.server_forever()

この実装は、ここにあるものと似ています。

http://blog.pythonisito.com/2012/08/building-tcp-servers-with-gevent.html

現在、エラーはなく、サーバーは正しく動作しているように見えますが、何も読み取っていません (したがって、送信していません)。sock.makefile()Windows7で正しく動作しない可能性はありますか? それとも、問題は別の場所にあるのでしょうか?

私はsock.makefile()単純なものに置き換えようとしました

while True:
    line = sock.recv(2048)

しかし、この操作は明らかにブロックします。

また、gevent と を混ぜてみましspawnsock.setblocking(0)。これで改善され、機能しましたが、一度に 300 を超える接続を処理することはできませんでした。

Linuxでいくつかのテストを行い、違いがあるかどうかを確認します。それまでの間、何かアイデアがあれば、遠慮なく私と共有してください。乾杯!

更新元のコードは、Ubuntu 12.04 で同じことを行います。では、gevent TCPサーバーをどのように実装すればよいですか??

4

1 に答える 1

2

サーバーに何を送信しましたか?newline で終了していることを確認してください。そうしないと、readline() が機能しません。

コードで正しいことをしていると思われる場合は、tcpdump または wireshark を使用して、TCP 層で何が起こっているかを確認することもできます。

于 2013-03-05T19:38:17.573 に答える