Socket文件传输

服务端:
输入文件完整路径发送给客户端

import struct
import json
import os

tcp_server = socket()
ip_port = (('127.0.0.1', 8080))
buffsize = 1024

#   端口的重复利用

tcp_server.bind(ip_port)
tcp_server.listen(5)
print('还没有人链接')
while True:
    '''链接循环'''
    conn, addr = tcp_server.accept()

    print('链接人的信息:', addr)
    while True:
        if not conn:
            print('客户端链接中断')
            break
        '''通信循环'''
        filemesg = input('请输入要传送的文件名加后缀>>>').strip()

        filesize_bytes = os.path.getsize(filemesg) # 得到文件的大小,字节


        dirc = {
            'filename': filemesg,
            'filesize_bytes': filesize_bytes,
        }
        head_info = json.dumps(dirc)  # 将字典转换成字符串
        head_info_len = struct.pack('i', len(head_info)) #  将字符串的长度打包
        #   先将报头转换成字符串(json.dumps), 再将字符串的长度打包
        #   发送报头长度,发送报头内容,最后放真是内容
        #   报头内容包括文件名,文件信息,报头
        #   接收时:先接收4个字节的报头长度,
        #   将报头长度解压,得到头部信息的大小,在接收头部信息, 反序列化(json.loads)
        #   最后接收真实文件
        conn.send(head_info_len)  # 发送head_info的长度
        conn.send(head_info.encode('utf-8'))

        #   发送真是信息
        with open(filemesg, 'rb') as f:
            data = f.read()
            conn.sendall(data)

        print('发送成功')

客户端:
接收文件 :

import struct
import json
import os
import sys
import time


tcp_client = socket()
ip_port = (('127.0.0.1', 8080))
buffsize = 1024
tcp_client.connect_ex(ip_port)
print('等待链接服务端')
while True:
    head_struct = tcp_client.recv(4)  # 接收报头的长度,
    print(head_struct)
    if head_struct:
        print('已连接服务端,等待接收数据')
    head_len = struct.unpack('i', head_struct)[0]  # 解析出报头的字符串大小
    data = tcp_client.recv(head_len)  # 接收长度为head_len的报头内容的信息 (包含文件大小,文件名的内容)
    print(f"{data}")

    head_dir = json.loads(data.decode('utf-8'))
    filesize_b = head_dir['filesize_bytes'] # 文件字节数
    filename = head_dir['filename']  # 文件路径    "newC:\\\\Users\\\\Administrator\\\\Desktop\\\\txt\\\\2.txt"
    (filepath, tempfilename) = os.path.split(filename)
    # filename2 文件名  extension 文件后缀
    (filename2,extension) = os.path.splitext(tempfilename)

    #   接受真的文件内容
    recv_len = 0
    recv_mesg = b''

    f = open(f"./new{filename2}{extension}", 'w')
    ff = open(f"./new{filename2}{extension}", 'wb')
    if extension == ".txt":
        while recv_len < filesize_b:
            percent = recv_len / filesize_b


            if filesize_b - recv_len > buffsize: # 文件字节数 - 接收长度 > 缓冲字节

                recv_mesg = tcp_client.recv(buffsize)
                f.write(recv_mesg)
                recv_len += len(recv_mesg)
            else:
                recv_mesg = tcp_client.recv(filesize_b - recv_len)
                recv_len += len(recv_mesg)
                f.write(recv_mesg.decode("gbk"))
    else:
        while recv_len < filesize_b:
            percent = recv_len / filesize_b

            if filesize_b - recv_len > buffsize:  # 文件字节数 - 接收长度 > 缓冲字节

                recv_mesg = tcp_client.recv(buffsize)
                ff.write(recv_mesg)
                recv_len += len(recv_mesg)
            else:
                recv_mesg = tcp_client.recv(filesize_b - recv_len)
                recv_len += len(recv_mesg)
                ff.write(recv_mesg)




    print(recv_len, filesize_b)

    print(f"接收文件成功,大小为:{recv_len},{filesize_b}")


    f.close()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值