Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SocketServer.TCPServer错误号10054_Python_Sockets_Python 2.7 - Fatal编程技术网

Python SocketServer.TCPServer错误号10054

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

我正在使用Python2.7中的socketserver模块运行python服务器。OmniPeek数据包分析工具显示TCP握手完成, 但是服务器会立即发送一个重置数据包,终止连接

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

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有关