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)

但是这个操作显然会阻塞。

我也尝试将 geventspawnsock.setblocking(0). 现在这更好并且它工作了,但是它一次不能处理超过 300 个连接。

我将在 Linux 上做一些测试,看看它是否有所作为。同时,如果您有任何想法,请随时与我分享。干杯!

更新原始代码在 Ubuntu 12.04 下做同样的事情。那么我应该如何实现gevent TCP服务器?

4

1 回答 1

2

你给服务器发了什么?确保它被换行符终止。否则 readline() 将不起作用。

如果您认为自己在代码中做正确的事情,您还可以使用 tcpdump 或 wireshark 来查看 TCP 层发生了什么。

于 2013-03-05T19:38:17.573 回答