2013-03-05 43 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