Windows上的gevent TCP服务器
我一直在尝试用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的spawn
和sock.setblocking(0)
结合起来。这种方法效果稍好,能工作,但一次最多只能处理大约300个连接。
我打算在Linux上做一些测试,看看是否会有不同的结果。与此同时,如果你有任何想法,欢迎和我分享。谢谢!
更新 原来的代码在Ubuntu 12.04下也做同样的事情。那么我该如何实现gevent TCP服务器呢?
1 个回答
2
你发送给服务器的内容是什么?确保它以换行符结束,否则readline()这个函数就无法正常工作。
如果你觉得自己的代码没问题,可以使用tcpdump或wireshark这类工具,看看在TCP层发生了什么。