博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
通过socket实现文件发送,并解决粘包问题
阅读量:7000 次
发布时间:2019-06-27

本文共 2522 字,大约阅读时间需要 8 分钟。

一、socket文件发送_server(服务器端)
1 # Author:David Liu  2 # Be Happy! 3 ''' 4 FTP server 5 1.读取文件名 6 2.检测文件是否存在 7 3.打开文件 8 4.检测文件大小 9 5.发送文件大小给客户端10 6.等待客户端确认11 7.开始边读边发数据12 8.发送md513 '''14 import socket,os,time,hashlib15 server=socket.socket()16 server.bind(('localhost',9999))17 server.listen()18 while True:19     conn,addr=server.accept()20     print("new conn",addr)21     while True:22         print("等待新指令")23         data=conn.recv(1024)24         if not data:25             print("客户端已断开")26             break27 28         cmd,filename=data.decode().split()29         print(filename)30         if os.path.isfile(filename):31             f=open(filename,'rb')32             m=hashlib.md5()33             file_size=os.stat(filename).st_size34             conn.send(str(file_size).encode())35             conn.recv(1024)36             for line in f:37                 m.update(line)38                 conn.send(line)39             print("file md5",m.hexdigest())40             conn.send(m.hexdigest().encode())41             f.close()42 43         print("send done")44 server.close()
二、socket文件发送_client(客户端)
1 # Author:David Liu  2 # Be Happy! 3  4 import socket 5 import hashlib 6 client=socket.socket() 7  8 client.connect(('localhost',9999)) 9 10 while True:11     cmd=input(">>:").strip()12     if len(cmd)==0:continue13     if cmd.startswith("get"):14         client.send(cmd.encode())15         server_response=client.recv(1024)16         print("文件大小",server_response)17         client.send(b"ready to recevie")18         file_total_size=int(server_response.decode())19         received_size=020         filename=cmd.split()[1]21         f=open(filename+'.new','wb')22 23         m=hashlib.md5()24 25         while received_size
1024:#表示要收不止一次28 size=102429 else:#最后一次了,剩多少收多少30 size=file_total_size-received_size31 print("last receive:", size)32 #---^33 data=client.recv(size)34 received_size+=len(data)35 m.update(data)36 f.write(data)37 print(file_total_size,received_size)38 39 else:40 new_file_md5=m.hexdigest()41 print("文件接收完毕!")42 f.close()43 server_filr_md5=client.recv(1024)44 print("server file md5:",server_filr_md5)45 print("client file md5:",new_file_md5)46 47 client.close()
 

功能片段,留存……

感觉越来越难了哈哈哈,挺住!

2019年5月23日

 

转载于:https://www.cnblogs.com/David0207AlwaysHappy/p/10911601.html

你可能感兴趣的文章
oracle的nvl和nvl2
查看>>
hdfs 写orc
查看>>
1.9 xz压缩和解压缩
查看>>
IDEA如何自动提示并补全syso和main呢?
查看>>
9.数组和向量
查看>>
JXL读写Excel
查看>>
mysql自定义排序
查看>>
java UDP 一对一文件传输
查看>>
Netty5入门学习笔记003-TCP粘包/拆包问题的解决之道(下)
查看>>
SpringMVC之@ResponseBody
查看>>
Ubuntu开机自动挂载Windows分区(NTFS FAT32)教程
查看>>
Oracle学习笔记6
查看>>
Centos7开通端口方法
查看>>
php数据库永久链接其实一般没必要使用,如果网站并发量大,数据库支持的连接数小就会出问题...
查看>>
oracle--架构
查看>>
动态规划的基本方法---多阶段决策过程及实例
查看>>
顺序数据---隐马尔科夫模型
查看>>
Spring boot 使用jpa时对于数据库的配置
查看>>
驰骋工作流引擎设计系列02
查看>>
Spring Security源码分析十:初识Spring Security OAuth2
查看>>