wkq0220

TCP传输大文件

服务端

import socket
import os
import json
import struct


server = socket.socket()
server.bind((\'127.0.0.1\',8080))
server.listen(5)

while True:
    conn,addr = server.accept()
    while True:
        try:
            header_len = conn.recv(4)
            # 解析字典报头
            header_len = struct.unpack(\'i\',header_len)[0]
            # 再接收字典数据
            header_dic = conn.recv(header_len)
            real_dic = json.loads(header_dic.decode(\'utf-8\'))
            # 获取数据长度
            total_size = real_dic.get(\'file_size\')
            # 循环接收并写入文件
            recv_size = 0
            with open(real_dic.get(\'file_name\'),\'wb\') as f:
                while recv_size < total_size:
                    data = conn.recv(1024)
                    f.write(data)
                    recv_size += len(data)
                print(\'上传成功\')
        except ConnectionResetError as e:
            print(e)
            break
    conn.close()

客户端

import socket
import json
import os
import struct


client = socket.socket()
client.connect((\'127.0.0.1\',8080))

while True:
    # 获取电影列表 循环展示
    MOVIE_DIR = r\'D:\python脱产10期视频\day25\视频\'
    movie_list = os.listdir(MOVIE_DIR)
    # print(movie_list)
    for i,movie in enumerate(movie_list,1):
        print(i,movie)
    # 用户选择
    choice = input(\'please choice movie to upload>>>:\')
    # 判断是否是数字
    if choice.isdigit():
        # 将字符串数字转为int
        choice = int(choice) - 1
        # 判断用户选择在不在列表范围内
        if choice in range(0,len(movie_list)):
            # 获取到用户想上传的文件路径
            path = movie_list[choice]
            # 拼接文件的绝对路径
            file_path = os.path.join(MOVIE_DIR,path)
            # 获取文件大小
            file_size = os.path.getsize(file_path)
            # 定义一个字典
            res_d = {
                \'file_name\':\'性感荷官在线发牌.mp4\',
                \'file_size\':file_size,
                \'msg\':\'注意身体,多喝营养快线\'
            }
            # 序列化字典
            json_d = json.dumps(res_d)
            json_bytes = json_d.encode(\'utf-8\')

            # 1.先制作字典格式的报头
            header = struct.pack(\'i\',len(json_bytes))
            # 2.发送字典的报头
            client.send(header)
            # 3.再发字典
            client.send(json_bytes)
            # 4.再发文件数据(打开文件循环发送)
            with open(file_path,\'rb\') as f:
                for line in f:
                    client.send(line)
        else:
            print(\'not in range\')
    else:
        print(\'must be a number\')

 

UDP模拟QQ

服务端

import socket


server = socket.socket(type=socket.SOCK_DGRAM)
server.bind((\'127.0.0.1\',8080))

while True:
    data, addr = server.recvfrom(1024)
    print(data.decode(\'utf-8\'))
    msg = input(\'>>>:\')
    server.sendto(msg.encode(\'utf-8\'),addr)

 

客户端

import socket


client = socket.socket(type=socket.SOCK_DGRAM)
server_address = (\'127.0.0.1\',8080)

while True:
    msg = input(\'>>>:\')
    msg = \'来自客户端1的消息:%s\'%msg
    client.sendto(msg.encode(\'utf-8\'),server_address)
    data, server_addr = client.recvfrom(1024)
    print(data.decode(\'utf-8\'))

 

分类:

技术点:

相关文章:

  • 2021-09-26
  • 2021-07-09
  • 2021-11-29
  • 2021-09-29
  • 2021-10-14
  • 2021-11-01
  • 2021-11-01
  • 2021-11-01
猜你喜欢
  • 2021-05-11
  • 2021-04-09
  • 2021-08-14
  • 2021-12-21
  • 2021-08-19
  • 2021-11-22
  • 2021-08-12
相关资源
相似解决方案