Python SocketServer.TCPServer错误号10054
我正在使用Python2.7中的socketserver模块运行python服务器。OmniPeek数据包分析工具显示TCP握手完成, 但是服务器会立即发送一个重置数据包,终止连接 简化的服务器代码显示问题是:Python SocketServer.TCPServer错误号10054,python,sockets,python-2.7,Python,Sockets,Python 2.7,我正在使用Python2.7中的socketserver模块运行python服务器。OmniPeek数据包分析工具显示TCP握手完成, 但是服务器会立即发送一个重置数据包,终止连接 简化的服务器代码显示问题是: from threading import Lock, Thread, Condition import SocketServer import socket import sys import time class ThreadedTCPRequestHandler(SocketS
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
服务器代码基于示例中的Python2.7 docs serversocket Mixin,看起来非常简单,但是
谢谢我不确定你的预期行为是什么,但是如果你做了一些改变,你就会发现它可以工作 替换你的句柄方法
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..."
和clientinside main:
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
我只是修改它来发送资料和打印资料。但它没有崩溃。
我认为你的自我存在问题。状态['lock']。获取和释放呼叫。我进行了“运行”检查,因为除了在服务器代码末尾之外,它并没有真正被使用。
此外,如果不执行任何操作,套接字将超时
再一次,我并不是说已经“解决”了你的问题…我也不确定你到底在寻找什么…只是帮你头脑风暴 道歉-红鲱鱼。只有当服务器在来宾机下运行而客户机在主机下运行时,问题才会在VM下发生。当客户机和服务器都在主机或来宾机上运行时,TCP重置数据包从未发送过感谢您的发布。在发布之前,为了简洁起见,我取出了所有的发送/接收代码,但问题和VM有关