2014-09-30 158 views
0

我在python 2.7中运行一个使用socketserver模块的python服务器。 OmniPeek数据包分析工具显示TCP握手完成, 但服务器立即发送一个重置数据包来查看连接。Python SocketServer.TCPServer errno 10054

简化服务器代码表示的问题是:

from threading import Lock, Thread, Condition 
import SocketServer 
import socket 
import sys 
import time 


class ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler): 

    def __init__(self, state, *args, **keys): 

     try: 
      state['lock'].acquire() 
      state['client_count'] += 1 
     finally: 
      state['lock'].release() 

     self.state = state 
     SocketServer.BaseRequestHandler.__init__(self, *args, **keys) 

    def handle(self): 
     self.state['lock'].acquire() 
     count = self.state['client_count'] 
     self.state['lock'].release() 

     while True: 
      try: 
       self.state['lock'].acquire() 
       running = self.state['running'] 
       self.state['lock'].release() 
       if not running: 
        break; 

       time.sleep(1) # do some work 

      except Exception as msg: 
       print msg 

     print "ThreadedTCPRequestHandler shutting down..." 


class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer): 
    pass 


def handler_factory(state): 
    def createHandler(*args, **keys): 
     return ThreadedTCPRequestHandler(state, *args, **keys) 
    return createHandler 

if __name__ == "__main__": 
    lock = Lock() 
    cv = Condition(lock) 
    state = {'running': True, 'client_count': 0, 'lock': lock, 'cv': cv} 

    server = ThreadedTCPServer(('localhost', 12345), handler_factory(state)) 
    server_thread = Thread(target=server.serve_forever) 
    server_thread.daemon = True 
    server_thread.start() 
    print "Server loop running in thread:", server_thread.name 

    # wait for a client to connect 
    cv.acquire() 
    while state['client_count'] == 0 and state['running']: 
     cv.wait(1.0) 
     # print msg 
    cv.release() 

    # substitute real work here... 
    time.sleep(5) 

    lock.acquire() 
    state['running'] = False 
    lock.release() 
    server.shutdown() 

和客户端的代码:

import socket 

if __name__ == "__main__": 
    try: 
     client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     print 'ip: {} port {}'.format('10.4.2.54', 12345) 
     client.connect(('10.4.2.54', 12345)) 

     while True: 
      data = client.recv(4096) 
      if len(data) == 0: 
       break; 

      print 'data: {}'.format(data) 

     client.shutdown(socket.SHUT_RDWR) 
     client.close() 
    except Exception as msg: 
     print msg 

服务器代码是基于关闭蟒2.7文档的ServerSocket密新实例,并且似乎非常简单,但...

谢谢

回答

0

道歉 - 红鲱鱼。当服务器在guest虚拟机下运行并且客户机在主机下运行时,问题只发生在虚拟机下。当客户端和服务器都在主机或客户端上运行时,TCP重置数据包从未发送

0

不知道你是什么[R预期的行为是,但如果你做一些修改,你就可以看到,它可以工作

取代你的手柄方法

def handle(self): 
    while True: 
     try: 
      data = self.request.recv(1024).strip() 
      if len(data) != 0: 
       print data 

      time.sleep(1) # do some work 
      self.request.send('test data') 
     except Exception as msg: 
      print msg 
      break 

    print "ThreadedTCPRequestHandler shutting down..." 

和客户(内部主):

try: 
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    print 'ip: {} port {}'.format('localhost', 1232) 
    client.connect(('localhost', 1232)) 
    client.send('test') 
    n = 0 
    while True: 
     data = client.recv(4096) 
     if len(data) != 0: 
      print 'data: {}'.format(data) 

     time.sleep(1) 
     n += 1 
     client.send('keep-alive' + str(n) + '\n') 
     print 'here' 

    client.shutdown(socket.SHUT_RDWR) 
    client.close() 
except Exception as msg: 
    print msg 

我只是改装它发送东西和打印的东西。但它不会崩溃。 我认为你的self.state ['lock'] .success()和release()调用有问题。我拿出'运行'检查,因为它除了在服务器代码的末尾之外并没有真正使用。 另外,没有任何操作,套接字将超时。

再一次,我并没有声称“解决”了你的问题......我不确定你正在寻找什么......只是帮助你集思广益!

+0

感谢发布。为了简洁起见,我在发布前取出了所有send/recv代码,但问题与VM有关 – user658878 2014-10-01 16:48:59

相关问题