IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 网络编程学习(6)—— 基于SOCKET实现文件传输功能 -> 正文阅读

[网络协议]网络编程学习(6)—— 基于SOCKET实现文件传输功能

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

文件传输功能和执行终端命令功能的区别

文件传输功能实现和实现执行终端命令功能的区别

  1. 不需要执行命令,即不需要使用 subprocess 模块
  2. 判断文件大小方式不是文件内容的长度,而是使用 os模块
import os
os.path.getsize(文件路径)
  1. 上传文件时,为防止一次上传完整文件导致内存不足,上传时,一行行上传
with open(文件, "rb") as f:
	for line in f:
		conn.send(line)

代码实现

服务端

# coding=gbk
import os.path
import socket
import struct
import json

dir_path = "C:\\Users\\ASUS\\Desktop\\CSDN\\网络编程\\09-文件传输功能\\server\\share\\"

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

server.bind(("127.0.0.1", 8080))

server.listen(5)

while True: # 链接循环
    conn,addr = server.accept()
    print(addr)
    while True: # 通信循环
        try:
            cmd = conn.recv(8096)
            if not cmd:
                break
            # 获取要下载的文件名
            filename = cmd.split()[1].decode("utf-8")
            # 获取文件大小,即字节长度
            total_size = os.path.getsize("%s%s" % (dir_path, filename))
            # 报头字典
            header_dic = {
                "filename": filename,
                "total_size": total_size
            }
            # 字典转换为字符串
            header_bytes = json.dumps(header_dic)
            # 字符串长度编码并发送
            header_bytes_length = struct.pack("i", len(header_bytes))
            # 发送报头编码
            conn.send(header_bytes_length)
            # 发送字典字符串
            conn.send(header_bytes.encode("utf-8"))
            # 发送文件
            with open("%s%s" % (dir_path, filename), "rb") as f:
                for line in f:
                    conn.send(line)
        except ConnectionResetError:
            break
    conn.close()

server.close()

客户端

# coding=gbk
import socket
import json
import struct

dir_path = "C:\\Users\\ASUS\\Desktop\\CSDN\\网络编程\\09-文件传输功能\\client\\download\\"

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

client.connect(("127.0.0.1", 8080))

while True:# 通信循环
    cmd = input(">>: ").strip()
    if not cmd:
        continue
    client.send(cmd.encode("utf-8"))
    filename = cmd.split()[1]
    # 接收报头并解码
    header_bytes_length = struct.unpack("i", client.recv(4))[0]
    # 接收字典字符串
    header_bytes_size = 0
    header_bytes = b""
    while header_bytes_size < header_bytes_length:
        data = client.recv(1024)
        header_bytes += data
        header_bytes_size += len(data)
    # 字典字符串转换成字典
    header_dic = json.loads(header_bytes)
    print(header_dic)
    # 下载文件
    total_size = header_dic["total_size"]
    file_size = 0
    with open("%s%s" % (dir_path, filename), "wb") as f:
        while file_size < total_size:
            data = client.recv(1024)
            f.write(data)
            file_size += len(data)
	print("下载完成")
client.close()

运行结果

请添加图片描述

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-03-08 22:56:03  更:2022-03-08 22:56:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 7:49:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码