2023年8月3日发(作者:)
socket传送⽂件⼀、⽂件传送步骤 我们要利⽤socket来实现下载⼀个⽂件,该如何操作呢? 服务端:1.
2.
3.
4.
5.
6.
7.
8.
读取⽂件名判断⽂件是否存在检测⽂件⼤⼩(⽤于和客户端对⽐判断⽂件是否传送完毕)发送⽂件⼤⼩给客户端等待客户端确认(防⽌粘包)打开⽂件边读边发送数据md5验证 客户端:发送命令接收⽂件⼤⼩返回确认获取⽂件名对⽐⽂件⼤⼩写⼊⽂件⼆、功能实现(ftp下载功能) 服务端:# -*- coding: UTF-8 -*-import osimport socket# TCP/IP协议, tcp ,如果不填写就是默认这个server = (_INET, _STREAM)(('localhost', 9999))()while True: # 可以接受多个客户端 conn, addr = () print('new conn', addr) while True: cmd_res = (1024) if not cmd_res: # 防⽌当接受的客户端数据为空时,程序卡掉 print('client ') break else: # 获取命令和⽂件名 cmd, filename = cmd_().split() print(cmd, filename) if (filename): # 判断⽂件是否存在 # ⽂件⼤⼩ file_size = (filename).st_size # 发送⽂件⼤⼩ (str(file_size).encode(encoding='utf-8')) # 等待客户端确认 (1024) # 打开⽂件 f = open(filename, 'rb') for line in f: (line) print('sending') ()View Code 客户端:# -*- coding: UTF-8 -*-import socketclient = ()t(('localhost', 9999))while True: cmd = input('>>:').strip() # 判断是否发送空数据,如果是就重新发送 if len(cmd) == 0: continue else: (('utf-8')) # 获取服务端发送的⽂件⼤⼩ size = (1024) total_file_size = int(()) # 返回确认 (b'file size received') filename = ()[1] print(filename) received_size = 0 # 写⼊⽂件 f = open(filename + '.new', 'w', encoding='utf-8') while received_size < total_file_size: r_data = (1024) received_size += len(r_data) (r_() + 'n') else: print('file sizes', total_file_size, received_size) print('receive finished') ()View Code 有些问题 替换⼀些内容
f = open(filename + '.new', 'wb')(r_data) 这个程序有缺陷,⾸先⽬前只能读取本⽂件夹下的⽂件,新⽣成的⽂件没有中⽂乱码问题,ok...三、md5验证⽂件 加个md5来验证⽂件是否⼀致 服务端:# -*- coding: UTF-8 -*-import osimport socketimport hashlib# TCP/IP协议, tcp ,如果不填写就是默认这个server = (_INET, _STREAM)(('localhost', 9999))()while True: # 可以接受多个客户端 conn, addr = () print('new conn', addr) while True: cmd_res = (1024) if not cmd_res: # 防⽌当接受的客户端数据为空时,程序卡掉 print('client ') break else: # md5 m = 5() # 获取命令和⽂件名 cmd, filename = cmd_().split() print(cmd, filename) if (filename): # 判断⽂件是否存在 # ⽂件⼤⼩ file_size = (filename).st_size print(file_size) # 发送⽂件⼤⼩ (str(file_size).encode(encoding='utf-8')) # 等待客户端确认 (1024) # 打开⽂件 f = open(filename, 'rb') for line in f: (line) # ('abc') ('123') # 其实和('abc123') 结果⼀下 (line) () print('send done') # 发送md5信息 (est().encode('utf-8')) 客户端:# -*- coding: UTF-8 -*-import socketimport hashlibclient = ()t(('localhost', 9999))while True: cmd = input('>>:').strip() # 判断是否发送空数据,如果是就重新发送 if len(cmd) == 0: continue else: (('utf-8')) # 获取服务端发送的⽂件⼤⼩ f_size = (1024) total_file_size = int(f_()) # 返回确认 (b'file size received') filename = ()[1] print(filename) received_size = 0 # md5 m = 5() # 写⼊⽂件 f = open(filename + '.new', 'wb') # 新⽣成的⽂件也正常显⽰ while received_size < total_file_size: if total_file_size - received_size > 1024: # 以此来控制只收⽂件的内容,不会粘包md5的内容 size = 1024 else: size = total_file_size - received_size r_data = (size) received_size += len(r_data) (r_data) (r_data) # print(r_()) # print('file sizes', total_file_size, received_size) else: print('file sizes', total_file_size, received_size) server_md5 = (1024).decode() client_md5 = est() print(server_md5) print(client_md5) print('receive finished') () 结果: 结果看上去没有问题了,新⽂件也能⽣成,并且有内容
2023年8月3日发(作者:)
socket传送⽂件⼀、⽂件传送步骤 我们要利⽤socket来实现下载⼀个⽂件,该如何操作呢? 服务端:1.
2.
3.
4.
5.
6.
7.
8.
读取⽂件名判断⽂件是否存在检测⽂件⼤⼩(⽤于和客户端对⽐判断⽂件是否传送完毕)发送⽂件⼤⼩给客户端等待客户端确认(防⽌粘包)打开⽂件边读边发送数据md5验证 客户端:发送命令接收⽂件⼤⼩返回确认获取⽂件名对⽐⽂件⼤⼩写⼊⽂件⼆、功能实现(ftp下载功能) 服务端:# -*- coding: UTF-8 -*-import osimport socket# TCP/IP协议, tcp ,如果不填写就是默认这个server = (_INET, _STREAM)(('localhost', 9999))()while True: # 可以接受多个客户端 conn, addr = () print('new conn', addr) while True: cmd_res = (1024) if not cmd_res: # 防⽌当接受的客户端数据为空时,程序卡掉 print('client ') break else: # 获取命令和⽂件名 cmd, filename = cmd_().split() print(cmd, filename) if (filename): # 判断⽂件是否存在 # ⽂件⼤⼩ file_size = (filename).st_size # 发送⽂件⼤⼩ (str(file_size).encode(encoding='utf-8')) # 等待客户端确认 (1024) # 打开⽂件 f = open(filename, 'rb') for line in f: (line) print('sending') ()View Code 客户端:# -*- coding: UTF-8 -*-import socketclient = ()t(('localhost', 9999))while True: cmd = input('>>:').strip() # 判断是否发送空数据,如果是就重新发送 if len(cmd) == 0: continue else: (('utf-8')) # 获取服务端发送的⽂件⼤⼩ size = (1024) total_file_size = int(()) # 返回确认 (b'file size received') filename = ()[1] print(filename) received_size = 0 # 写⼊⽂件 f = open(filename + '.new', 'w', encoding='utf-8') while received_size < total_file_size: r_data = (1024) received_size += len(r_data) (r_() + 'n') else: print('file sizes', total_file_size, received_size) print('receive finished') ()View Code 有些问题 替换⼀些内容
f = open(filename + '.new', 'wb')(r_data) 这个程序有缺陷,⾸先⽬前只能读取本⽂件夹下的⽂件,新⽣成的⽂件没有中⽂乱码问题,ok...三、md5验证⽂件 加个md5来验证⽂件是否⼀致 服务端:# -*- coding: UTF-8 -*-import osimport socketimport hashlib# TCP/IP协议, tcp ,如果不填写就是默认这个server = (_INET, _STREAM)(('localhost', 9999))()while True: # 可以接受多个客户端 conn, addr = () print('new conn', addr) while True: cmd_res = (1024) if not cmd_res: # 防⽌当接受的客户端数据为空时,程序卡掉 print('client ') break else: # md5 m = 5() # 获取命令和⽂件名 cmd, filename = cmd_().split() print(cmd, filename) if (filename): # 判断⽂件是否存在 # ⽂件⼤⼩ file_size = (filename).st_size print(file_size) # 发送⽂件⼤⼩ (str(file_size).encode(encoding='utf-8')) # 等待客户端确认 (1024) # 打开⽂件 f = open(filename, 'rb') for line in f: (line) # ('abc') ('123') # 其实和('abc123') 结果⼀下 (line) () print('send done') # 发送md5信息 (est().encode('utf-8')) 客户端:# -*- coding: UTF-8 -*-import socketimport hashlibclient = ()t(('localhost', 9999))while True: cmd = input('>>:').strip() # 判断是否发送空数据,如果是就重新发送 if len(cmd) == 0: continue else: (('utf-8')) # 获取服务端发送的⽂件⼤⼩ f_size = (1024) total_file_size = int(f_()) # 返回确认 (b'file size received') filename = ()[1] print(filename) received_size = 0 # md5 m = 5() # 写⼊⽂件 f = open(filename + '.new', 'wb') # 新⽣成的⽂件也正常显⽰ while received_size < total_file_size: if total_file_size - received_size > 1024: # 以此来控制只收⽂件的内容,不会粘包md5的内容 size = 1024 else: size = total_file_size - received_size r_data = (size) received_size += len(r_data) (r_data) (r_data) # print(r_()) # print('file sizes', total_file_size, received_size) else: print('file sizes', total_file_size, received_size) server_md5 = (1024).decode() client_md5 = est() print(server_md5) print(client_md5) print('receive finished') () 结果: 结果看上去没有问题了,新⽂件也能⽣成,并且有内容
发布评论