2013-03-05 44 views
1

我一直在尝试使用gevent创建一个没有任何(主要)成功的TCP服务器。我认为问题在于Windows(我之前在Windows下有套接字问题)。我在Windows7下使用Python2.7,gevent0.13。这里是我的代码:Windows上的gevent TCP服务器

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

现在有没有错误,服务器似乎正常工作,但它不读书(并因此发送)任何东西。在Windows7下,sock.makefile()可能无法正常工作吗?或者问题可能在别的地方?

我试图用简单的

while True: 
    line = sock.recv(2048) 

更换sock.makefile()但这种操作显然块。

我也试图混合gevent的spawnsock.setblocking(0)。现在这个更好,它的工作,但它不能处理多达300个连接。

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

UPDATE原始代码在Ubuntu 12.04下执行相同的操作。那么我应该如何实现gevent TCP服务器?

回答

1

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

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

+0

令人难以置信。我一直专注于复杂的事情,而我却错过了那些显而易见的事情。 :)是的,我一直发送''ping''。我已经将它改为'“ping \ n”',现在它应该可以正常工作!非常感谢你!顺便说一下:我将它的性能与其线程版本的性能进行了比较,实际上似乎线程版本更高效!我可能仍然在做一些错误的事情,但我猜这跟现在的问题没有关系。 :) – freakish 2013-03-05 19:47:14