Windows上的gevent TCP服务器

1 投票
1 回答
942 浏览
提问于 2025-04-17 18:01

我一直在尝试用gevent创建一个TCP服务器,但到现在为止还没成功。我觉得问题可能出在Windows上(之前在Windows下使用socket时也遇到过一些问题)。我现在用的是Python2.7和gevent0.13,操作系统是Windows7。以下是我的代码:

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服务器呢?

1 个回答

2

你发送给服务器的内容是什么?确保它以换行符结束,否则readline()这个函数就无法正常工作。

如果你觉得自己的代码没问题,可以使用tcpdump或wireshark这类工具,看看在TCP层发生了什么。

撰写回答