一、文件传送步骤

  我们要利用socket来实现下载一个文件,该如何操作呢?

  服务端:

  1. 读取文件名
  2. 判断文件是否存在
  3. 检测文件大小(用于和客户端对比判断文件是否传送完毕)
  4. 发送文件大小给客户端
  5. 等待客户端确认(防止粘包)
  6. 打开文件
  7. 边读边发送数据
  8. md5验证

  客户端:

  • 发送命令
  • 接收文件大小
  • 返回确认
  • 获取文件名
  • 对比文件大小
  • 写入文件

二、功能实现(ftp下载功能)

  服务端:

# -*- coding: UTF-8 -*-
import os
import socket # TCP/IP协议, tcp ,如果不填写就是默认这个
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind(('localhost', 9999)) server.listen() while True: # 可以接受多个客户端 conn, addr = server.accept()
print('new conn', addr)
while True: cmd_res = conn.recv(1024)
if not cmd_res: # 防止当接受的客户端数据为空时,程序卡掉
print('client has lost...')
break
else:
# 获取命令和文件名
cmd, filename = cmd_res.decode().split()
print(cmd, filename)
if os.path.isfile(filename): # 判断文件是否存在
# 文件大小
file_size = os.stat(filename).st_size
# 发送文件大小
conn.send(str(file_size).encode(encoding='utf-8'))
# 等待客户端确认
conn.recv(1024)
# 打开文件
f = open(filename, 'rb')
for line in f:
conn.send(line)
print('sending')
f.close()

  客户端:

# -*- coding: UTF-8 -*-
import socket client = socket.socket() client.connect(('localhost', 9999)) while True:
cmd = input('>>:').strip()
# 判断是否发送空数据,如果是就重新发送
if len(cmd) == 0:
continue
else:
client.send(cmd.encode('utf-8'))
# 获取服务端发送的文件大小
size = client.recv(1024)
total_file_size = int(size.decode()) # 返回确认
client.send(b'file size received')
filename = cmd.split()[1]
print(filename)
received_size = 0
# 写入文件
f = open(filename + '.new', 'w', encoding='utf-8')
while received_size < total_file_size:
r_data = client.recv(1024)
received_size += len(r_data)
f.write(r_data.decode() + '\n')
else:
print('file sizes', total_file_size, received_size)
print('receive finished')
f.close()

 有些问题 替换一些内容

f = open(filename + '.new', 'wb')
f.write(r_data)

   

  这个程序有缺陷,首先目前只能读取本文件夹下的文件,新生成的文件没有中文乱码问题,ok...

三、md5验证文件

  加个md5来验证文件是否一致

  服务端:

# -*- coding: UTF-8 -*-
import os
import socket
import hashlib # TCP/IP协议, tcp ,如果不填写就是默认这个
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind(('localhost', 9999)) server.listen() while True: # 可以接受多个客户端 conn, addr = server.accept()
print('new conn', addr)
while True: cmd_res = conn.recv(1024)
if not cmd_res: # 防止当接受的客户端数据为空时,程序卡掉
print('client has lost...')
break
else:
# md5
m = hashlib.md5()
# 获取命令和文件名
cmd, filename = cmd_res.decode().split()
print(cmd, filename)
if os.path.isfile(filename): # 判断文件是否存在
# 文件大小
file_size = os.stat(filename).st_size
print(file_size)
# 发送文件大小
conn.send(str(file_size).encode(encoding='utf-8'))
# 等待客户端确认
conn.recv(1024)
# 打开文件
f = open(filename, 'rb')
for line in f:
m.update(line)
# m.update('abc') m.update('123')
# 其实和m.update('abc123') 结果一下
conn.send(line) f.close()
print('send done')
# 发送md5信息
conn.send(m.hexdigest().encode('utf-8'))

  客户端:

# -*- coding: UTF-8 -*-
import socket
import hashlib client = socket.socket() client.connect(('localhost', 9999)) while True:
cmd = input('>>:').strip()
# 判断是否发送空数据,如果是就重新发送
if len(cmd) == 0:
continue
else:
client.send(cmd.encode('utf-8'))
# 获取服务端发送的文件大小
f_size = client.recv(1024)
total_file_size = int(f_size.decode()) # 返回确认
client.send(b'file size received')
filename = cmd.split()[1]
print(filename)
received_size = 0
# md5
m = hashlib.md5() # 写入文件
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 = client.recv(size)
received_size += len(r_data)
m.update(r_data)
f.write(r_data)
# print(r_data.decode())
# print('file sizes', total_file_size, received_size)
else:
print('file sizes', total_file_size, received_size)
server_md5 = client.recv(1024).decode()
client_md5 = m.hexdigest()
print(server_md5)
print(client_md5)
print('receive finished')
f.close()

  结果:

  

  结果看上去没有问题了,新文件也能生成,并且有内容

socket传送文件的更多相关文章

  1. Socket 传送文件

    1.传送文本文件 1.1服务端 package com; import java.io.BufferedWriter; import java.io.DataInputStream; import j ...

  2. socket传送文件格式的问题

    在python3中socket传送文件只能传送‘bytes'类型,如下例子: import socket client = socket.socket()client.connect(("l ...

  3. C语言sendto()函数-经socket传送数据以及recvfrom函数《转》

    相关函数:send, sendmsg, recv, recvfrom, socket 头文件:#include <sys/types.h>   #include <sys/socke ...

  4. python socket 传输文件

    推荐资料 https://www.cnblogs.com/xiaokang01/p/9865724.html socket传输文件 思路: # 先将报头转换成字符串(json.dumps), 再将字符 ...

  5. SZ,RZ传送文件

    linux 和window之间通过xshell的命令 SZ,RZ传送文件:

  6. socket头文件

    一. 三种类型的套接字:1.流式套接字(SOCKET_STREAM)    提供面向连接的可靠的数据传输服务.数据被看作是字节流,无长度限制.例如FTP协议就采用这种.2.数据报式套接字(SOCKET ...

  7. python使用简单http协议来传送文件

    python使用简单http协议来传送文件!在ubuntu环境下,局域网内可以使用nc来传送文件,也可以使用基于Http协议的方式来下载文件我们可以使用python -m SimpleHTTPServ ...

  8. Linux SSH 远程操作与传送文件

    操作系统:centos 6.5 x64 一.远程连接:在进行linux 的 ssh远程操作前,一定要确认linux 是否安装了 openssh-clients,为了方便起见,一般用yum安装即可:# ...

  9. Java使用Socket传输文件遇到的问题(转)

    1.写了一个socket传输文件的程序,发现传输过去文件有问题.找了一下午终于似乎找到了原因,记录下来警示一下: 接受文件的一端,向本地写文件之前使用Thread.sleep(time)休息一下就解决 ...

随机推荐

  1. IT视频课程集(包含各类Oracle、DB2、Linux、Mysql、Nosql、Hadoop、BI、云计算、编程开发、网络、大数据、虚拟化

    马哥Linux培训视频课程:http://pan.baidu.com/s/1pJwk7dp Oracle.大数据系列课程:http://pan.baidu.com/s/1bnng3yZ 天善智能BI培 ...

  2. 20172305 2018-2019-1 《Java软件结构与数据结构》第八周学习总结

    20172305 2018-2019-1 <Java软件结构与数据结构>第八周学习总结 教材学习内容总结 本周内容主要为书第十二章内容: 堆(附加属性的二叉树) 完全二叉树 (最小堆)对于 ...

  3. Python语言基础

    一.Python简介 Python是跨平台动态语言 特点:优雅.明确.简单 适用:web网站和网络服务:系统工具和脚步:包装其他语言开发的模块 不适用:贴近硬件(首选C):移动开发:IOS/Andro ...

  4. 关于在eclipse Oxygen 2017环境下spring3.2 asm的异常

    今天在oxygen 2017下构建spring3.2+mybatis项目时,发生异常,大概是说无法解析我mapper.class文件,错误发生在core.asm中<unknow:source&g ...

  5. 词法分析用c++实现的

    #include<stdio.h>#include<string.h>int i,j,k,sign,flag,number,run;char ch;char word[10]; ...

  6. Python入门:认识变量和字符串

    几个月前,我开始学习个人形象管理,从发型.妆容.服饰到仪表仪态,都开始做全新改造,在塑造个人风格时,最基础的是先了解自己属于哪种风格,然后找到参考对象去模仿,可以是自己欣赏的人.明星或模特等,直至最后 ...

  7. chrome 常用插件集锦

    stylish 改变浏览器CSS样式

  8. Linux的cut命令

    cut是一个选取命令,就是将一段数据经过分析,取出我们想要的.一般来说,选取信息通常是针对“行”来进行分析的,并不是整篇信息分析的. (1)其语法格式为:cut  [-bn] [file] 或 cut ...

  9. AtCoder Regular Contest 083 D: Restoring Road Network

    题意 有一张无向带权连通图(点数<=300),给出任意两点i,j之间的最短路长度dis[i][j].问是否存在一张这样的无向图.如果不存在输出-1.如果存在输出所有这样的无向图中边权和最小的一张 ...

  10. TortoiseSVN 和 VisualSVN Server 使用教程

    TortoiseSVN 和 VisualSVN Server 使用教程 来源 https://blog.csdn.net/xgf415/article/details/75196360 目录: SVN ...