Python-socket发送文件并解决粘包问题

服务器端要先根据客户端要下载的文件进行判断是否存在,还要根据文件大小来进行传送,最后还要比对文件的md5值来判断传送的文件是否正确,通过判断剩余字节来解决粘包问题

服务器端

# -*- coding:utf-8 -*-
__author__ = "MuT6 Sch01aR"

import socket
import os
import hashlib

server = socket.socket()
server.bind((‘127.0.0.1‘,8080))
server.listen()
print(‘等待客户端连接‘)

while True:
    conn,addr = server.accept()
    print(‘当前连接客户端:‘,addr)
    while True:
        print(‘等待客户端下载指令‘)
        data = conn.recv(1024)
        if not data:
            print(‘客户端已断开连接‘)
            break
        filename = data.decode()
        if os.path.isfile(filename): #判断文件是否存在
            f = open(filename,‘rb‘)
            m = hashlib.md5()
            file_size = os.stat(filename).st_size #获取文件大小
            conn.send(str(file_size).encode()) #发送文件大小
            conn.recv(1024) #等待确认
            for line in f:
                conn.send(line) #发送文件
                m.update(line)
            print("文件md5值:", m.hexdigest())
            conn.send(m.hexdigest().encode())  #发送md5值
            f.close()
        print(‘发送完成‘)
server.close()

客户端

# -*- coding:utf-8 -*-
__author__ = "MuT6 Sch01aR"

import socket
import hashlib

client = socket.socket()
client.connect((‘127.0.0.1‘,8080))

while True:
    cmd = input(‘请输入需要下载的文件:‘).strip()
    client.send(cmd.encode())
    if len(cmd) == 0:continue
    server_file_size = client.recv(1024)
    client.send(‘准备好接收文件了‘.encode())

    server_file_size = int(server_file_size.decode()) #要接收的文件大小
    received_size = 0

    filename = cmd
    f = open(filename+‘_new‘,‘wb‘)

    m = hashlib.md5()

    while received_size < server_file_size:
        if server_file_size - received_size >1024: #判断要接收的次数是否大于一次
            left_size = 1024
        else:
            left_size = server_file_size - received_size
        data = client.recv(left_size)
        received_size += len(data)
        m.update(data)
        f.write(data)
    else:
        new_file_md5 = m.hexdigest()
        print(‘下载完成‘,received_size,server_file_size)
        f.close()
    server_file_md5 = client.recv(1024)
    if new_file_md5.encode() == server_file_md5:
        print(‘下载文件正确‘)
    else:
        print(‘下载了错误文件‘)

client.close()

运行结果

服务器端

文件传输结果

原文地址:https://www.cnblogs.com/sch01ar/p/8443546.html

时间: 2024-12-09 12:36:06

Python-socket发送文件并解决粘包问题的相关文章

python基础--socket套接字、粘包问题

本地回环地址:127.0.0.1 简易版服务端: import socket ? server = socket.socket() # 就比如买了一个手机 server.bind(("127.0.0.1",8080)) # bind中绑定的是IP地址和端口号,注意是一个元组,就比如,将手机卡,插入了手机 server.listen(5) # 半连接池,最大等待连接数为5个,就比如开机 conn,address = server.accept() # 接听电话等着别人给你打电话 ? da

socket大文件传输(解决粘包)

解决粘包 模块struct struct.pack(type,num) type:是num的类型 num :是一个数字 r = struct.pack 把一个数字打包成一个四字节的bytes struct.unpack(type,r) 功能:解包,把r解成原数字,结果是一个元组,原数字在元组的下标位0的位置 #解决粘包:原理是在服务器接收到字典长度后,根据字典长度去recv字典中的内容,就不会造成recv最后一次接收完后剩下的空间留给部分文件内容所造成字典内容和文件内容黏在一起 #实现文件的上传

Python网络编程04/recv原理/高大上版解决粘包方式

目录 Python网络编程04/recv原理/高大上版解决粘包方式 1.昨日内容回顾 2.recv工作原理 3.高大上版解决粘包方式(自定制报头) 3.1 解决思路: 3.2 服务端 3.3客户端 4.基于UDP协议的socket通信 4.1服务端 4.2客户端 Python网络编程04/recv原理/高大上版解决粘包方式 1.昨日内容回顾 1. 通信循环 2. 链接通信循环 3. 远程执行命令: subprocess.Popen() # bytes: 网络传输, 文件存储时. 4. 粘包现象

10.python网络编程(解决粘包问题 part 2)

一.什么时候会产生粘包现象. 只有在使用tcp协议的情况下才会产生粘包现象!udp协议永远不会! 发送端可以1k1k的把数据发送出去,接收端,可以2k2k的的去接收数据,一次可能会接收3k,也有可能1次接收6k. TCP协议是面向流的协议,这也是容易出现粘包问题的原因.而UDP是面向消息的协议,每个UDP段都是一条消息,应用程序必须以消息为单位提取数据,不能一次提取任意字节的数据,这一点和TCP是很不同的.怎样定义消息呢?可以认为对方一次性write/send的数据为一个消息,需要明白的是当对方

python开发socket网络编程基础:粘包问题&amp;udp套接字

一,发生粘包 服务器端 1 from socket import * 2 phone=socket(AF_INET,SOCK_STREAM) #套接字 3 phone.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #解决端口占用 4 phone.bind(('127.0.0.1',8080)) #绑定端口和Ip到套接字 5 phone.listen(5) 6 conn,client_addr=phone.accept() #等待tcp接受 7 8 9 # data1

Python网络编程03/ low版解决粘包问题

目录 Python网络编程03/ low版解决粘包问题 1.操作系统的缓存区 2.基于TCP协议的socket循环通信 2.1 服务端(server) 2.2客户端(client) 3.基于TCP协议的socket链接+循环 通信 3.1服务端(server) 3.2 客户端(client) 4.基于TCP协议的socket应用实例:执行远程命令 4.1服务端(server) 4.2客户端(client) 5.粘包现象 5.1服务端(server) 5.2客户端(client) 5.3展示收发问

网络编程 TCP协议:三次握手,四次回收,反馈机制 socket套接字通信 粘包问题与解决方法

TCP协议:三次握手,四次挥手 TCP协议建立双向通道. 三次握手, 建连接: 1:客户端向服务端发送建立连接的请求 2:服务端返回收到请求的信息给客户端,并且发送往客户端建立连接的请求 3:客户端接收到服务端发来的请求,返回接成功给服务端,完成双向连接 第一客戶向服务端发送请求,请求建立连接 服务端同客户端的请求,并同时向客户端发送建立 连接的请求,最后客户端同意后建立 双向连接. C ----> S C <---- S - 反馈机制: 客户端往服务端发送请求,服务端必须返回响应, 告诉客户

Socket解决粘包问题1

粘包是指发送端发送的包速度过快,到接收端那边多包并成一个包的现象,比如发送端连续10次发送1个字符'a',因为发送的速度很快,接收端可能一次就收到了10个字符'aaaaaaaaaa',这就是接收端的粘包. 可能我们在平时练习时没觉的粘包有什么危害,或者通过把发送端发送的速率调慢来解决粘包,但在实时通信中,发送端常常是单片机或者其他系统的信息采集机,它们的发送速率是无法控制的,如果不解决接收端的粘包问题,我们无法获得正常的信息. 就以我自己正在做的项目来说,接收端是一台单频指标测量仪,它会把当前测

c# socket 解决粘包,半包

处理原理: 半包:即一条消息底层分几次发送,先有个头包读取整条消息的长度,当不满足长度时,将消息临时缓存起来,直到满足长度再解码 粘包:两条完整/不完整消息粘在一起,一般是解码完上一条消息,然后再判断是否有剩余字节,有的话缓存起来,循环半包处理 客户端接收代码: private void callReceived(object sender, SocketAsyncEventArgs args) { var socket = sender as Socket; var bb = args.Use