2013-03-05 2 views
1

지금까지 (모든 주요) 성공없이 gevent를 사용하여 TCP 서버를 만들려고했습니다. Windows에서 문제가 발생했다고 생각합니다. 이전에 Windows 소켓과 관련된 문제가있었습니다. 나는 Python2.7, Windows7에서 gevent0.13을 사용하고 있습니다. 그러나 그것은 읽는되지 않으며,Windows의 gevent TCP 서버

http://blog.pythonisito.com/2012/08/building-tcp-servers-with-gevent.html

지금 오류가없는 서버가 제대로 작동하는 것 같다 :

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() 

이 구현은 여기에서 찾을 수있는 것과 유사 : 여기에 내 코드입니다 (따라서 전송). Windows7에서 sock.makefile()이 올바르게 작동하지 않을 수 있습니까? 아니면 문제가 다른 곳에있는 것일까 요?

나는이 작업을 분명히 블록을 간단한

while True: 
    line = sock.recv(2048) 

sock.makefile()를 교체하려고했지만했습니다.

또한 gevent의 spawnsock.setblocking(0)을 섞어 사용했습니다. 이제는 더 좋았고 효과적 이었지만 한번에 300 개 이상의 연결을 처리하지 못했습니다.

리눅스에서 몇 가지 테스트를하고 차이가 있는지 알아 보겠습니다. 그 동안 아이디어가 있다면 저와 공유해주십시오. 건배!

업데이트 원본 코드는 우분투 12.04에서 동일한 기능을합니다. 어떻게하면 gevent TCP 서버를 구현해야합니까 ??

답변

1

서버에 무엇을 보냈습니까? newline에 의해 종료되었는지 확인하십시오. 그렇지 않으면 readline()이 작동하지 않습니다.

코드에서 올바른 일을한다고 생각하면 tcpdump 또는 wireshark를 사용하여 TCP 레이어에서 어떤 일이 발생하는지 확인할 수 있습니다.

+0

믿을 수 없습니다. 나는 복잡한 것들에 너무 집중하여 분명히 놓쳤다. :) 예, 저는 항상 "핑 (ping)"을 보냈습니다. 나는 그것을 "ping \ n"'으로 변경했고 이제는 정상적으로 작동합니다! 고마워요! 그건 그렇고 : 자사의 성능을 자사의 스레드 버전의 성능과 비교했습니다 실제로 스레드 버전이 더 효율적입니다 보인다! 나는 여전히 잘못된 것을하고 있을지 모르지만 지금은 그 질문과 관련이 없다고 생각합니다. :) – freakish