文件上传,基于udp协议的socket,socketserver

1.文件的上传

服务端
import socket
import struct
import json
import os
import hashlib
MY_FILE = os.path.join(os.path.dirname(__file__),'my_file')
def socket_server():
    server = socket.socket()
    server.bind(('127.0.0.1',8888))
    server.listen(5)
    conn, addr = server.accept()
    head_len_bytes = conn.recv(4)
    head_len = struct.unpack('i',head_len_bytes)[0]
    head_dic_json_bytes = conn.recv(head_len)
    head_dic_json = head_dic_json_bytes.decode('utf-8')
    head_dic = json.loads(head_dic_json)
    with open(os.path.join(MY_FILE,head_dic['file_name']),mode='w',encoding='utf-8') as f1:
        total_size = 0
        ret = hashlib.md5()
        while total_size < head_dic['file_size']:
            every_data = conn.recv(1024)
            ret.update(every_data)
            f1.write(every_data.decode('utf-8'))
            total_size += len(every_data)
    md5 = ret.hexdigest()
    if md5 == head_dic['MD5']:
        print('上传成功')
    else:
        os.remove(os.path.join(MY_FILE,head_dic['file_name']))
        print('文件具有风险性,上传失败')
    conn.close()
    server.close()
socket_server()
客户端
import socket
import os
import json
import struct
import hashlib
FILE_PATH = os.path.join(os.path.dirname(__file__), 'demo')
def socket_client():
    client = socket.socket()
    client.connect(('127.0.0.1',8888))
    with open(FILE_PATH,mode='r',encoding='utf-8')as f:
        ret = hashlib.md5()
        while 1:
            content = f.read(1024)
            if content:
                ret.update(content.encode('utf-8'))
            else:
                md5 = ret.hexdigest()
                break
    head_dic = {
        'MD5': md5,
        'file_name':os.path.basename(FILE_PATH),
        'file_size': os.path.getsize(FILE_PATH),
    }
    head_dic_json = json.dumps(head_dic)
    head_dic_json_bytes = head_dic_json.encode('utf-8')
    head_len = len(head_dic_json_bytes)
    head_len_bytes = struct.pack('i',head_len)
    client.send(head_len_bytes)
    client.send(head_dic_json_bytes)
    with open(FILE_PATH,mode='r',encoding='utf-8') as f1:
        while 1:
            every_data = f1.read(1024)
            if every_data:
                client.send(every_data.encode('utf-8'))
            else:
                break
    client.close()
socket_client()

2.基于udp协议的socket

服务端
import socket
udp_server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
udp_server.bind(('127.0.0.1',8888))
while 1:
    from_client_data = udp_server.recvfrom(1024)
    print(f'来自{from_client_data[1]}的消息:{from_client_data[0].decode("utf-8")}')
    to_client_data = input('>>>').strip()
    udp_server.sendto(to_client_data.encode('utf-8'),from_client_data[1])

客户端
import socket
udp_client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
while 1:
    to_server_data = input('>>>').strip()
    udp_client.sendto(to_server_data.encode('utf-8'),('127.0.0.1',8888))
    from_server_data = udp_client.recvfrom(1024)
    print(f'来自{from_server_data[1]}的消息:{from_server_data[0].decode("utf-8")}')

3.socketserver

服务端
import socketserver
class MyServer(socketserver.BaseRequestHandler):
    def handle(self):  # 必须是这个handle名字
        while 1:
            from_client_data = self.request.recv(1024).decode('utf-8')   #self.request 相当于conn管道
            print(from_client_data)
            to_client_data = input('>>>').strip()
            self.request.send(to_client_data.encode('utf-8'))

if __name__ == 'main':
    ip_port = (('127,0,0,1',8888))
    server = socketserver.ThreadingTCPServer(ip_port,MyServer)
    server.serve_forever()

猜你喜欢

转载自www.cnblogs.com/wxl1025/p/11207995.html
今日推荐