如何使用socketserver接收大文件?

2024-10-02 18:25:41 发布

您现在位置:Python中文网/ 问答频道 /正文

服务器端接收并发回客户端数据:

import socketserver

    class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler):

        def handle(self):
            try:
                data = b''
                while True:
                    package = self.request.recv(4096)
                    if not package:
                        break
                    data = data + package
                self.request.sendall(data)
            except ConnectionError as conError:
                print(conError)

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

    if __name__ == "__main__":
        HOST, PORT = "localhost", 50007
        print('Server start work!')
        server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler)
        ip, port = server.server_address
        try:
            server.serve_forever()
        except keyboardInterrupt:
            print('Server stop by Keyboard Interrupt.')

客户端读取txt文件,发送到服务器等待回复:

^{pr2}$

但实现这种“挂”后的最后一块数据。我的问题是,什么需要改变,这将得到所有的数据。在


Tags: 数据self客户端packagedataifserverrequest
1条回答
网友
1楼 · 发布于 2024-10-02 18:25:41

我解决了如下问题,在前10个字符中我发送的数据大小要接收并服务器端检查接收到的数据,如果它是由客户端发送的,那么继续接收数据。在

所以您需要修改服务器端:

import socketserver

    class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler):

        def handle(self):
            try:
                 package = self.request.recv(4096)
                 data_size = package[:10].strip(b'0')
                 data = package[10:]
                 while len(data) < int(data_size):
                     package = self.request.recv(4096)
                     if not package:
                       break
                 data = data + package
                 self.request.sendall(data)
            except ConnectionError as conError:
                print(conError)

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

    if __name__ == "__main__":
        HOST, PORT = "localhost", 50007
        print('Server start work!')
        server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler)
        ip, port = server.server_address
        try:
            server.serve_forever()
        except KeyboardInterrupt:
            print('Server stop by Keyboard Interrupt.')

客户端:

^{pr2}$

相关问题 更多 >