代码编织梦想

实现文件传输功能

在通信循环中实现文件传输功能,以下载图片1.png为例,命令为:get 1.png

1、客户端发送命令:

cmd = input(">>:").strip() # get 1.png
    if not cmd:continue
    phone.send(cmd.encode("utf-8"))

2、服务端收命令:

res = conn.recv(8096)
        if not res:break

3、服务端解析命令:

        cmds = res.decode("utf-8").split() #得到['get','1.png']
        filename = cmds[1]

4、服务端以读的方式打开文件,读取文件内容发送给客户端:

  • 第一步:制作固定长度数据头
        header_dic = {
            "filename": filename,
            "md5": "xxxdxxx",
            'file_size': os.path.getsize(r"%s\%s"%(share_dir,filename))
        }
        header_json = json.dumps(header_dic)
        header_bytes = header_json.encode('utf-8')
  • 第二步:先发送数据头的长度
        conn.send(struct.pack("i",len(header_bytes)))
  • 第三步:再发送数据头
        conn.send(header_bytes)
  • 第四步:再发送真实数据
        with open(("%s\%s"%(share_dir,filename)),"rb") as f:
            # conn.send(f.read())
            for line in f:
                conn.send(line) # 逐行读取再发送,有效节约系统内存,但是会粘包

5、 客户端以写的方式打开一个新的文件,接收服务端发来的文件的内容写入客户的新文件:

  • 第一步:先收数据头的长度
    obj = phone.recv(4) header_size = struct.unpack('i',obj)[0]
  • 第二步:再收数据头
    header_bytes = phone.recv(header_size)
  • 第三步:从数据头中解析出对真实数据的描述信息
    header_json = header_bytes.decode("utf-8") 
    header_dic = json.loads(header_json) 
    print(header_dic)
    # 查询数据头中包含的信息
    total_size = header_dic["file_size"] 
    filename = header_dic["filename"]
  • 第四步:接收真实的数据
    with open("%s\%s"%(download_dir,filename),"wb") as f:
        recv_size = 0
        while recv_size < total_size:
            line= phone.recv(1024)
            # 接收到一行就写入一行
            f.write(line)
            recv_size += len(line)
            print("总大小:%s 已经下载大小:%s"%(total_size,recv_size))

程序目录结构 

 

完整代码演示 

1、服务端代码

import socket
import subprocess
import struct
import json
import os

share_dir = r"E:\mydesktop\My_Code\后端\b站网络编程\05文件传输\server\share"

phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
phone.bind(("127.0.0.1",9910))
phone.listen(5)
print("starting...")

while True:
    conn,client_addr = phone.accept()
    print(client_addr)
    while True:
        # 1、收命令
        res = conn.recv(8096)
        if not res:break

        # 2、解析命令,提取相应命令参数
        cmds = res.decode("utf-8").split() #得到['get','a.txt']
        filename = cmds[1]

        # 3、以读的方式打开文件,读取文件内容发送给客户端
        # 第一步:制作固定长度的报头。
        header_dic = {
            "filename": filename,
            "md5": "xxxdxxx",
            'file_size': os.path.getsize(r"%s\%s"%(share_dir,filename))
        }
        header_json = json.dumps(header_dic)
        header_bytes = header_json.encode('utf-8')

        # 第二步:先发送报头的长度
        conn.send(struct.pack("i",len(header_bytes)))

        # 第三步:再发报头
        conn.send(header_bytes)

        # 第四步:再发送真实的数据
        with open(("%s\%s"%(share_dir,filename)),"rb") as f:
            # conn.send(f.read())
            for line in f:
                conn.send(line) # 逐行读取再发送,有效节约系统内存,但是会粘包

    conn.close()
phone.close()

2、客户端代码

import socket
import struct
import json

download_dir = r"E:\mydesktop\My_Code\后端\b站网络编程\05文件传输\client\Download"

phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
phone.connect(("127.0.0.1",9910))

while True:
    # 1、发命令
    cmd = input(">>:").strip() # get a.txt
    if not cmd:continue
    phone.send(cmd.encode("utf-8"))

    # 2、以写的方式打开一个新的文件,接收服务端发来的文件的内容写入客户的新文件
    # 第一步:先收报头的长度
    obj = phone.recv(4)
    header_size = struct.unpack('i',obj)[0]

    # 第二步:再收报头
    header_bytes = phone.recv(header_size)

    # 第三步:从数据头中解析出对真实数据的描述信息
    header_json = header_bytes.decode("utf-8")
    header_dic = json.loads(header_json)
    print(header_dic)
    # 查询数据头中包含的信息
    total_size = header_dic["file_size"]
    filename = header_dic["filename"]

    # 第四步:接收真实的数据
    with open("%s\%s"%(download_dir,filename),"wb") as f:
        recv_size = 0
        while recv_size < total_size:
            line= phone.recv(1024)
            # 接收到一行就写入一行
            f.write(line)
            recv_size += len(line)
            print("总大小:%s 已经下载大小:%s"%(total_size,recv_size))

phone.close()

3、先运行服务端,再运行客户端,在客户端控制台输入命令:get 1.png

1.png将被下载到Download目录下。 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/hold_on_qlc/article/details/128501681

客户端服务器的高级交互——————————文件传输-爱代码爱编程

今天晚上继续学习网络编程,客户机服务器的高级交互——————文件传输。 再一次强化了网络交互协议的概念。 下图是文件传输流和客户机服务器交互的具体流执行程序: 用文件传输流把文件传送到客户端程序,然后服务器用socket.getInputStream来接收客户端的数据流,然后再用FileOutputStream把文件从服务器程序输出到本地。

python网络编程——使用tcp方式传输文件_hmmhmh的博客-爱代码爱编程

TCP文件下载器 客户端 需求:输入要下载的文件名,从服务器端将文件拷贝到本地 步骤: 1.创建TCP套接字,绑定端口 2.连接服务端 3.输入要下载的文件名 4.将文件名编码,并发送到服务端 5.接收服务端

socket编程二十二:socket编程实现文件传输功能_挺的博客的博客-爱代码爱编程_socket传文件

这节我们来完成 socket 文件传输程序,这是一个非常实用的例子。要实现的功能为:client 从 server 下载一个文件并保存到本地。 编写这个程序需要注意两个问题: 1) 文件大小不确定,有可能比缓冲区大很多,调用一次 write()/send() 函数不能完成文件内容的发送。接收数据时也会遇到同样的情况。 要解决这个问题,可以使用 while

网络编程——实验一:基于TCP&UDP的网络文件服务-爱代码爱编程

目录   前言:本篇文章不提供知识点教学,只提供一些常见问题的解决方法和实现实验要求的学习路径 1 java IO 2 java Socket 2.1 创建简单的TCP连接 2.2 创建简单的UDP连接 2.3 创建多线程服务器+多用户连接服务器 3 文件传输 3.1 UDP文件传输 3.2 TCP文件传输 4 实现实验要求 3.1

FTP编程实验——实现文件上传下载(基于Python3.7和PyQt5)-爱代码爱编程

目录 FTP编程实现文件上传下载(基于Python3.7和PyQt5)一、实验目的二、实验内容三、实验步骤(一)服务器端(二)客户端【1】 界面设计【2】 生成布局代码【3】 功能实现1.连接并登录FTP,返回文件列表(查询按钮)2.单击listView获取选中的item3.双击listView进入选中的item文件夹4.返回上一级目录(上一层按

初学python网络编程socket,并实现文件传输【含源代码】-爱代码爱编程

Socket 什么是Socketsocket()函数socket 对象内建方法实例:实现文件传输实例演示:源代码:最后 什么是Socket socket又称“套接字”, 应用程序通常通过“套接字”向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。 socket()函数 Python 中,我们用 socket()函数

socket编程实现文件传输功能-爱代码爱编程

这节我们来完成 socket 文件传输程序,这是一个非常实用的例子。要实现的功能为:client 从 server 下载一个文件并保存到本地。 编写这个程序需要注意两个问题: 1) 文件大小不确定,有可能比缓冲区大很多,调用一次 write()/send() 函数不能完成文件内容的发送。接收数据时也会遇到同样的情况。 要解决这个问题,可以使用 while

Linux socket编程实例 多进程 文件传输 服务器 网络通信【C语言】-爱代码爱编程

文章目录 一、实验目的二、实验内容三、实验步骤1.设计服务器和客户端的编程思路2.设计程序测试步骤与预期结果四、程序以及运行结果1.程序代码2.运行结果截图五、流程图六、实验体会 一、实验目的 在Linux系统中,使用C语言编程设计一个基于TCP/IP的文件传输系统,从而实现网络文件的收发。主要实现为一个面向连接的、并发服务器,并由客户端程序

WinPcap网络编程入门——0. 环境配置及系列介绍-爱代码爱编程

WinPcap网络编程入门——0. 环境配置及系列介绍 系列教程章节直达: Winpcap网络编程入门——1. 获取设备列表; 说明:本教程适用于网络编程开发人员入门,将从底层分析 WinPcap 的执行过程,结合一些实际用例来学习 WinPcap网络编程。 Pcap 技术是网络底层开发的重要工具之一,允许应用程序避开成熟的网络协议,直接处理网络数据

计算机网络课程实验3——编程实现可靠数据传输原理 Go-Back-N-爱代码爱编程

实验目的: 运用各种编程语言实现基于 Go-Back-N 的可靠数据传输软件。 实验意义: 通过本实验,使学生能够对可靠数据传输原理有进一步的理解和掌握。 实验背景: 实验步骤: 1,选择合适的编程语言编程实现基于 Go-Back-N 的可靠数据传输软件。 2,在实际网络环境或模拟不可靠网络环境中测试和验证自己的可靠数据传输软件。 实验代码如下

网络编程学习(6)—— 基于SOCKET实现文件传输功能-爱代码爱编程

网络编程学习(6)—— 基于SOCKET实现文件传输功能 文件传输功能和执行终端命令功能的区别代码实现运行结果 文件传输功能和执行终端命令功能的区别 文件传输功能实现和实现执行终端命令功能的区别 不需要执行命令,即不需要使用 subprocess 模块判断文件大小方式不是文件内容的长度,而是使用 os模块import os os.path.

网络编程【实现tftp上传功能】_九抈九的博客-爱代码爱编程

上传 简介客户端头文件客户端通过tcp连接到服务器端字符串解析函数上传函数 服务器端头文件服务器端建立tcp连接字符串解析函数服务器端下载 简介 通过tcp连接实现客户端上传,

【信息安全】-爱代码爱编程

系列文章目录 文章目录 系列文章目录前言一、信息安全基础知识二、学习安排1、 计算机硬件基础 三、网络安全学习1、 了解《网络安全法》2、 网络安全的类型3、 什么是网络安全4、 规划网络安全能力5、