在WinXP上SocketServer客户端第三次send()时出现套接字错误

0 投票
1 回答
1515 浏览
提问于 2025-04-15 17:34

我遇到了一个错误,内容是:

"socket.error: [10053] '软件导致连接中断'"

错误追踪(最近的调用最后):... self.send(json.dumps([0x02, subItems])+"\n") ... sent = self.handler.send(data) socket.error: [Errno 10053]

我已经正确建立了服务器,可以连接上去,发送“hello”消息,然后我还能再发送一个0x1类型的消息。但接下来客户端的操作服务器那边就看不见了。客户端程序抛出了上面的socket.error错误。

import SocketServer

class ThreadedTCPRequestHandler(SocketServer.StreamRequestHandler):
    def handle(self):
        #data = json.loads(self.request.recv(1024))
        if(self.request in subengine.sub.get_all_sub()):
            pass
        else:
            #login = json.loads(self.request.recv(1024))
            login = json.loads(self.rfile.readline().strip())
            logging.debug("User : %s connected" % login )

        data = json.loads(self.rfile.readline().strip())
        if(data[0]==0x1): # subscribe
            logging.info("subscribe message received, from %d" % self.request.fileno())
            logging.info("symbols to subscribe: %s" % data[1])
        elif (data[0] == 0x2): # unsubscribe
            logging.info("unsubscribe message received")
        else:
            pass

#    def finish(self):
#        logging.info("terminating connection")

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

server = ThreadedTCPServer(('localhost',5555), ThreadedTCPRequestHandler)
server_thread = threading.Thread(target=server.serve_forever)
server_thread.setDaemon(True)
server_thread.start()

客户端代码示例:

class Client:
    handler = None

    def __init__(self, uname = '', host = 'localhost', port = 0, sock = None):
        if sock is None:
            self.handler = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.host = host
        self.port = port
        self.uname = uname

    def feed_conection(self):
        self.handler.connect((self.host, self.port))
        if(self.handler != 0):
            self.handler.send(json.dumps(self.uname)+"\n")
        else:
            print ("Nie udalo sie polaczyc")

    def sub(self, subItems):
        self.send(json.dumps([0x01, subItems])+"\n")

    def unsub(self, subItems):
        self.send(json.dumps([0x02, subItems])+"\n")

    def send(self, data):
        data_len = len(data)
        total_sent = 0
        while(total_sent < data_len):
            sent = self.handler.send(data)
            if not sent:
                break
            data = data[sent:]
            total_sent += sent

1 个回答

0

如果你说的情况是真的,也就是说你的主服务器代码是这样结束的……:

server_thread.setDaemon(True)
server_thread.start()

那么你的代码实际上是在说:让 server_thread 在主线程结束时就死掉,让 server_thread 启动,然后让主线程结束——也就是说,你是在 start 一个后台线程后就“掉头”结束了?这可不对——一旦操作系统切换回你的主线程,哗啦,服务器那边的所有东西就都死掉了,正是你编程时设定的那样(所以当然,客户端想要继续和那个服务器对话就会遇到问题!)。你为什么要把 server_thread 设置为后台线程,却让主线程直接结束呢?也许你并没有贴出你实际使用的代码……?

撰写回答