• day 29-2 socket 文件传输、udp协议


    socket 文件传输

    函数版

    服务端

    import socket
    import struct
    import json
    import os
    
    def get(conn, cmd):
        file_name = cmd[1]
        file_size = os.path.getsize('%s/%s' % (service_path, file_name))
        header = {
            'file_name': file_name,
            'file_size': file_size
        }
        header_json = json.dumps(header)
        header_bytes = header_json.encode('utf-8')
        header_size = struct.pack('i', len(header_bytes))
        conn.send(header_size)
        conn.send(header_bytes)
        with open('%s/%s' % (service_path, file_name), 'rb') as f:
            for line in f:
                conn.send(line)
    
    
    def put(conn, cmd):
        pass
    
    
    def run():
        file = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        file.bind(('127.0.0.1', 8912))
        file.listen(5)
        while 1:
            print('wiating...')
            conn, addr = file.accept()
            while 1:
                cmd = conn.recv(1204).decode('utf-8').split()
                if not cmd: break
                print(cmd[0])
                if cmd[0] == 'get':
                    get(conn, cmd)
            conn.close()
        file.close()
    
    
    if __name__ == '__main__':
        run()

    客户端

    import socket
    import json
    import struct
    
    client_path = r'Y:py州_testTCP套接字通信套接字通信firstclient'
    
    
    def get(file, ret):
        file.send(ret.encode('utf-8'))
        header = file.recv(4)
        header_size = struct.unpack('i', header)
    
        header_info = file.recv(header_size[0])
        header_json = json.loads(header_info)
        file_name = header_json['file_name']
        file_size = header_json['file_size']
        recv_size = 0
        with open('%s/%s' % (client_path, file_name), 'wb') as f:
            while recv_size < file_size:
                ret = file.recv(1024)
                f.write(ret)
                recv_size += len(ret)
        print('传输大小:', recv_size)
    
    
    def put(file, ret):
        pass
    
    
    def run():
        file = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        file.connect(('127.0.0.1', 8912))
        while 1:
            ret = input('>>>').strip()
            if not ret: continue
            int = ret.split()
            if int[0] == 'get':
                get(file, ret)
        file.close()
    
    
    if __name__ == '__main__':
        run()

     

    面向对象版

    服务端

    import socket
    import struct
    import json
    import os
    
    
    class Server:
        service_path = r'Y:py州_testTCP套接字通信套接字通信firstserveice'
        address_family = socket.AF_INET
        socket_type = socket.SOCK_STREAM
        max_packet_size = 8192
        coding = 'utf-8'
        request_queue_size = 5
    
        def __init__(self, server_address, bind_and_activate=True):
            self.server_address = server_address
            self.socket = socket.socket(self.address_family,
                                        self.socket_type)
            if bind_and_activate:
                try:
                    self.server_bind()
                    self.server_listen()
                except:
                    self.server_close()
                    raise
    
        def server_bind(self):
            self.socket.bind(self.server_address)
    
        def server_listen(self):
            self.socket.listen(self.request_queue_size)
    
        def server_close(self):
            self.socket.close()
    
        def run(self):
            while True:
                print('wiating...')
                self.conn, self.addr = self.socket.accept()
                while True:
                    print(self.addr)
                    header = self.conn.recv(4)
                    if not header: break
                    header_len = struct.unpack('i', header)[0]
                    header_json = self.conn.recv(header_len).decode(self.coding)
                    header_dic = json.loads(header_json)
                    cmd = header_dic['cmd']
                    if hasattr(self, cmd):
                        func = getattr(self, cmd)
                        func(header_dic)
    
        def put(self, header):
            file_name = header['file_name']
            file_size = header['file_size']
            file_path = os.path.normpath(os.path.join(self.service_path, file_name))
            recv_size = 0
            with open(file_path, 'wb') as f:
                while recv_size < file_size:
                    ret = self.conn.recv(self.max_packet_size)
                    f.write(ret)
                    recv_size += len(ret)
            print("传输完成:", file_size)
    
    
    tcpserver = Server(('127.0.0.1', 8999))
    tcpserver.run()

    客户端

    import socket
    import json
    import struct
    import os
    
    
    class Client:
        client_path = r'Y:py州_testTCP套接字通信套接字通信firstclient'
        address_family = socket.AF_INET
        socket_type = socket.SOCK_STREAM
        max_packet_size = 8192
        coding = 'utf-8'
    
        def __init__(self, server_address, connect=True):
            self.server_address = server_address
            self.socket = socket.socket(self.address_family, self.socket_type)
    
            if connect:
                try:
                    self.client_connect()
                except:
                    self.client_close()
                    raise
    
        def client_connect(self):
            self.socket.connect(self.server_address)
    
        def client_close(self):
            self.socket.close()
    
        def run(self):
            cmd = input('>>>').strip()
            cmd_dic = cmd.split()
            cmds = cmd_dic[0]
            if hasattr(self, cmds):
                func = getattr(self, cmds)
                func(cmd_dic)
    
        def put(self, cmd):
            cmds = cmd[0]
            filename = cmd[1]
            if os.path.isfile(filename):
                filesize = os.path.getsize(filename)
            else:
                print('file:%s is not exists' % filename)
                return
            header_dic = {
                'cmd': cmds,
                'file_name': filename,
                'file_size': filesize
            }
    
            header_json = json.dumps(header_dic)
            header_bytes = header_json.encode(self.coding)
            header_len = struct.pack('i', len(header_bytes))
            self.socket.send(header_len)
            self.socket.send(header_bytes)
            send_len = 0
            with open(filename, 'rb') as f:
                for line in f:
                    self.socket.send(line)
                    send_len += len(line)
                    print(send_len)
                else:
                    print('upload successful')
    
    
    client = Client(('127.0.0.1', 8999))
    client.run()

    udp协议

    注意:udp协议不会发生粘包现象,每一次传输都是一个完整的报文;
    如果 recvfrom(1024) 大于接收字符,直接完全接收且不会粘包第二次传输的内容。
    如果 recvfrom(1024) 小于接收字符,则会丢失数据,数据不会缓存于通道中。

    服务端

    from socket import *
    
    server = socket(AF_INET, SOCK_DGRAM)
    server.bind(('127.0.0.1', 8099))
    
    while 1:
        info, addr = server.recvfrom(1024)
        server.sendto(info.upper(),addr)
    
    server.close()

    客户端

    from socket import *
    
    client = socket(AF_INET, SOCK_DGRAM)
    
    while 1:
        inp = input('>>>').strip()
        client.sendto(inp.encode('utf-8'), ('127.0.0.1', 8099))
        info, addr = client.recvfrom(1024)
        print(info)
    client.close()
  • 相关阅读:
    Q739.每日温度
    面试题46. 把数字成字符串
    [990. 等式方程的可满足性]--并查集
    [128. 最长连续序列]
    javaweb实现简单登陆功能
    7.12_python_lx_practise
    7.12_python_lx_day6
    7.12_python_lx_day5
    7.2_python_lx_day4
    7.2_python_lx_day3
  • 原文地址:https://www.cnblogs.com/ysging/p/12172735.html
Copyright © 2020-2023  润新知