Python编程:socket实现文件传输

简介: Python编程:socket实现文件传输

思路:

读取文件名

检测文件是否存在

打开文件

检测文件大小

发送文件大小和MD5值给客户端

等客户端确认

开始边读边发数据

MD5验证


# 服务器端
import socket
import os
import hashlib
server = socket.socket()
server.bind(("localhost", 6969)) # 绑定监听端口
server.listen(5)  # 监听
print("监听开始..")
while True:
    conn, addr = server.accept()  # 等待连接
    print("conn:", conn, "\naddr:", addr)  # conn连接实例
    while True:
        data = conn.recv(1024)  # 接收
        if not data:  # 客户端已断开
            print("客户端断开连接")
            break
        print("收到的命令:", data.decode("utf-8"))
        cmd, filename = data.decode("utf-8").split(" ")
        if cmd =="get":
            if os.path.isfile(filename):  # 判断文件存在
                # 1.先发送文件大小,让客户端准备接收
                size = os.stat(filename).st_size  #获取文件大小
                conn.send(str(size).encode("utf-8"))  # 发送数据长度
                print("发送的大小:", size)
                # 2.发送文件内容
                conn.recv(1024)  # 接收确认
                m = hashlib.md5()
                f = open(filename, "rb")
                for line in f:
                    conn.send(line)  # 发送数据
                    m.update(line)
                f.close()
                # 3.发送md5值进行校验
                md5 = m.hexdigest()
                conn.send(md5.encode("utf-8"))  # 发送md5值
                print("md5:", md5)
server.close()


# 客户端
import socket
import os
import hashlib
client = socket.socket()  # 生成socket连接对象
ip_port =("localhost", 6969)  # 地址和端口号
client.connect(ip_port)  # 连接
print("服务器已连接")
while True:
    content = input(">>")
    if len(content)==0: continue  # 如果传入空字符会阻塞
    if content.startswith("get"):
        client.send(content.encode("utf-8"))  # 传送和接收都是bytes类型
        # 1.先接收长度,建议8192
        server_response = client.recv(1024)
        file_size = int(server_response.decode("utf-8"))
        print("接收到的大小:", file_size)
        # 2.接收文件内容
        client.send("准备好接收".encode("utf-8"))  # 接收确认
        filename = "new" + content.split(" ")[1]
        f = open(filename, "wb")
        received_size = 0
        m = hashlib.md5()
        while received_size < file_size:
            size = 0  # 准确接收数据大小,解决粘包
            if file_size - received_size > 1024: # 多次接收
                size = 1024
            else:  # 最后一次接收完毕
                size = file_size - received_size
            data = client.recv(size)  # 多次接收内容,接收大数据
            data_len = len(data)
            received_size += data_len
            print("已接收:", int(received_size/file_size*100), "%")
            m.update(data)
            f.write(data)
        f.close()
        print("实际接收的大小:", received_size)  # 解码
        # 3.md5值校验
        md5_sever = client.recv(1024).decode("utf-8")
        md5_client = m.hexdigest()
        print("服务器发来的md5:", md5_sever)
        print("接收文件的md5:", md5_client)
        if md5_sever == md5_client:
            print("MD5值校验成功")
        else:
            print("MD5值校验失败")
client.close()

提示:客户端输入格式为:


get filename

相关文章
|
3月前
|
数据采集 机器学习/深度学习 人工智能
Python:现代编程的首选语言
Python:现代编程的首选语言
319 102
|
3月前
|
数据采集 机器学习/深度学习 算法框架/工具
Python:现代编程的瑞士军刀
Python:现代编程的瑞士军刀
345 104
|
3月前
|
人工智能 自然语言处理 算法框架/工具
Python:现代编程的首选语言
Python:现代编程的首选语言
276 103
|
3月前
|
机器学习/深度学习 人工智能 数据挖掘
Python:现代编程的首选语言
Python:现代编程的首选语言
206 82
|
2月前
|
Python
Python编程:运算符详解
本文全面详解Python各类运算符,涵盖算术、比较、逻辑、赋值、位、身份、成员运算符及优先级规则,结合实例代码与运行结果,助你深入掌握Python运算符的使用方法与应用场景。
219 3
|
2月前
|
数据处理 Python
Python编程:类型转换与输入输出
本教程介绍Python中输入输出与类型转换的基础知识,涵盖input()和print()的使用,int()、float()等类型转换方法,并通过综合示例演示数据处理、错误处理及格式化输出,助你掌握核心编程技能。
483 3
|
2月前
|
并行计算 安全 计算机视觉
Python多进程编程:用multiprocessing突破GIL限制
Python中GIL限制多线程性能,尤其在CPU密集型任务中。`multiprocessing`模块通过创建独立进程,绕过GIL,实现真正的并行计算。它支持进程池、队列、管道、共享内存和同步机制,适用于科学计算、图像处理等场景。相比多线程,多进程更适合利用多核优势,虽有较高内存开销,但能显著提升性能。合理使用进程池与通信机制,可最大化效率。
300 3
|
2月前
|
Java 调度 数据库
Python threading模块:多线程编程的实战指南
本文深入讲解Python多线程编程,涵盖threading模块的核心用法:线程创建、生命周期、同步机制(锁、信号量、条件变量)、线程通信(队列)、守护线程与线程池应用。结合实战案例,如多线程下载器,帮助开发者提升程序并发性能,适用于I/O密集型任务处理。
312 0
|
3月前
|
存储 安全 固态存储
基于C#实现的支持文件传输的Socket聊天室
基于C#实现的支持文件传输的Socket聊天室
258 5
|
3月前
|
数据采集 机器学习/深度学习 人工智能
Python:现代编程的多面手
Python:现代编程的多面手
93 0

推荐镜像

更多