1.基础版(供学习了解原理使用,low)

server服务端

import socket
import struct
import json server = socket.socket()
ip_port = ('127.0.0.1', 8001)
server.bind(ip_port)
server.listen()
conn, addr = server.accept() head_len_msg = conn.recv(4)
head_len = struct.unpack('i',head_len_msg)[0]
head_byte = conn.recv(head_len)
head = json.loads(head_byte.decode('utf-8'))
file_size = head['size']
size = 0
with open('文件副本',mode='wb') as f1:
while file_size:
if file_size >= 1024:
line = conn.recv(1024)
f1.write(line)
file_size -= 1024
else:
content = conn.recv(1024)
break
conn.close()
server.close()

  

client客户端

import os
import socket
import struct
import json client = socket.socket()
client.connect(('127.0.0.1', 8001)) buffer = 1024
filepath = input('请输入文件路径')
filesize = os.path.getsize(filepath)
head = {'size':os.path.getsize(filepath)}
head_json = json.dumps(head)
head_byte = head_json.encode('utf-8')
head_len = len(head_byte)
pack_len = struct.pack('i', head_len)
client.send(pack_len)
client.send(head_byte) with open(filepath,mode='rb') as f:
while filesize:
if filesize>buffer:
content = f.read(buffer)
client.send(content)
filesize -= buffer
else:
content = f.read(filesize)
client.send(content)
break

 

2.升级版(正常使用)

封装了报头,解决了粘包问题的FTP传文件 

server服务端

import struct,json,socket
import subprocess
import os # 引入所需模块

# 面向对象,定义server类
class MyTcpServer:
address_family = socket.AF_INET # 定义socket的family属性,使用ipv4
socket_type = socket.SOCK_STREAM # 定义面向类型,面向流,是tcp传输
allow_reuse_address = False # 服务器地址复用, 默认不允许
max_packet_size = 8192 # 传包最大缓冲长度
coding = 'utf-8' # 编码类型
request_queue_size = 5 # 等待队列数,listen()时使用
server_dir = 'file_upload' # 服务器存放上传文件的文件夹名 , 测试时 要新建一个名为file_upload的文件夹 def __init__(self, server_address, bind_and_active = True): # 初始化方法, 传入服务器地址, 是否要开始监听
self.server_address = server_address
self.socket = socket.socket() # 创建socket对象 if bind_and_active: # 如果需要连接
try: # 异常处理
self.server_bind() # 绑定端口
self.server_activate() # 监听开始
except:
self.server_close() # 服务器关闭
raise def server_bind(self): # bind() 方法
if self.allow_reuse_address: # 如果允许复用
self.socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR, 1) # 服务器允许端口复用写这句话 self.socket.bind(self.server_address) # socket对象绑定服务器地址
self.server_address = self.socket.getsockname() # 获取套接字的名称 ,服务器的地址 def server_activate(self): # 服务器listen()方法
self.socket.listen(self.request_queue_size) def server_close(self): # close()方法 的函数
self.socket.close() def get_request(self): # 得到请求 accpt()方法的函数
return self.socket.accept() def close_request(self,request): # 关闭请求的方法
request.close()
def run(self): # run方法
while 1:
self.conn,self.client_addr = self.get_request() # 获得conn ,addr
print('from client ', self.client_addr)
while 1:
try:
head_struct = self.conn.recv(4) # 接收4位 这4位是自定义报头的长度
if not head_struct: break # 如果 不是, 结束 head_len = struct.unpack('i', head_struct)[0] # 报头的长度 通过struct解包得出,解包为元组 第0项是报头长度,此时类型为字节
head_json = self.conn.recv(head_len).decode(self.coding) # 将长度解码
head_dic = json.loads(head_json) # 并用json转化为字典
print(head_dic) # 打印报头
cmd = head_dic['cmd'] # cmd 这一项等于 字典中的cmd选项 就是要实现什么功能
if hasattr(self,cmd): # 如果自己有cmd 这个功能
func = getattr(self,cmd) # 得到这个方法
func(head_dic) # 运行这个功能
except Exception:
break def put(self,args): # 接收文件
file_path = os.path.normpath(os.path.join(self.server_dir,args['filename'])) # 文件路径 将接收的文件名和自己的路径拼接 并标准化
filesize = args['filesize'] # 文件大小为报头中标出的
recv_size = 0 # 接收的长度 先定义为0
print('----->',file_path)
with open(file_path,'wb') as f: # 开始接收长度
while recv_size < filesize:
recv_data = self.conn.recv(self.max_packet_size) # recv最大可接收缓存为定义好的最大长度
f.write(recv_data) # 写入文件
recv_size += len(recv_data)
print('recvsize: %s filesize: %s' %(recv_size,filesize)) tcpserver1 = MyTcpServer(('127.0.0.1', 8001))
tcpserver1.run()

  

client客户端

import os
import socket,json,subprocess,struct class MyTcpClient:
addresss_family = socket.AF_INET
socket_type = socket.SOCK_STREAM
allow_reuse_address = False
max_packet_size = 8192
coding = 'utf-8'
request_queue_size = 5
def __init__(self, server_address, connect = True):
self.servver_address = server_address
self.socket = socket.socket(self.addresss_family,self.socket_type)
if connect:
try:
self.client_connect()
except:
self.client_close()
raise def client_connect(self):
self.socket.connect(self.servver_address) def client_close(self):
self.socket.close() def run(self):
while True:
inp = input('>>: ').strip()
if not inp:continue
l = inp.split()
cmd = l[0] # 运行的功能 为切出的第一项
if hasattr(self,cmd):
func = getattr(self,cmd)
func(l) def put(self,args): # 传文件
cmd = args[0] # 报头执行的命令
filename = args[1] # 文件名
if not os.path.isfile(filename): # 如果这个路径是文件
print('file:%s is not exists' % filename) # 如果不是为空
else:
filesize = os.path.getsize(filename) # 得到文件大小 head_dic = {'cmd':cmd,'filename':os.path.basename(filename),'filesize':filesize} # 定义报头
print(head_dic) # 打印一下报头看看
head_json = json.dumps(head_dic) # 用json转化为字符串
head_json_bytes = bytes(head_json, encoding=self.coding) # 编码成字节准备传输 head_struct = struct.pack('i', len(head_json_bytes)) # 用struct模块封包 把报头长度转化为4个字节
self.socket.send(head_struct) # 发送报头长度
self.socket.send(head_json_bytes) # 发送报头
send_size = 0
with open(filename,'rb') as f:
for line in f:
self.socket.send(line)
send_size += len(line)
print(send_size)
else:
print('upload successful') client = MyTcpClient(('127.0.0.1', 8001))
client.run()

  

python网络编程--FTP上传文件示例的更多相关文章

  1. python网络编程-socket上传下载文件(包括md5验证,大数据发送,粘包处理)

    ftp server 1) 读取文件名 2)检查文件是否存在 3)打开文件 4)检查文件大小 5)发送文件大小给客户端 6)等客户端确认 7)开始边读边(md5计算)发数据 8)给客户端发md5 ft ...

  2. python之路--FTP 上传视频示例

    # 服务端 import json import socket import struct server = socket.socket() server.bind(('127.0.0.1',8001 ...

  3. 网络编程4 网络编程之FTP上传简单示例&socketserver介绍&验证合法性连接

    今日大纲: 1.FTP上传简单示例(详细代码) 2.socketserver简单示例&源码介绍 3.验证合法性连接//[秘钥加密(urandom,sendall)(注意:中文的!不能用)] 内 ...

  4. FTP上传文件到服务器

    一.初始化上传控件. 1.我们这里用dropzone.js作为上传控件,下载地址http://www.dropzonejs.com/ 2.这里我们使用一个div元素作为dropzone载体. < ...

  5. ftp上传文件时遇到: ftplib.error_perm: 553 Could not create file

    问题描述 今天在使用python的ftplib模块上传文件时,碰到了这样的问题: ftplib.error_perm: 553 Could not create file. 原因 原因是FTP下对应的 ...

  6. .net FTP上传文件

    FTP上传文件代码实现: private void UploadFileByWebClient() { WebClient webClient = new WebClient(); webClient ...

  7. 通过cmd完成FTP上传文件操作

    一直使用 FileZilla 这个工具进行相关的 FTP 操作,而在某一次版本升级之后,发现不太好用了,连接老是掉,再后来完全连接不上去. 改用了一段时间的 Web 版的 FTP 工具,后来那个页面也 ...

  8. 再看ftp上传文件

    前言 去年在项目中用到ftp上传文件,用FtpWebRequest和FtpWebResponse封装一个帮助类,这个在网上能找到很多,前台使用Uploadify控件,然后在服务器上搭建Ftp服务器,在 ...

  9. FTP上传文件提示550错误原因分析。

    今天测试FTP上传文件功能,同样的代码从自己的Demo移到正式的代码中,不能实现功能,并报 Stream rs = ftp.GetRequestStream()提示远程服务器返回错误: (550) 文 ...

随机推荐

  1. [代码]set容器查找操作使用

    对于set容器来说,查找功能是该容器的主要优势,故针对该容器查找功能作一测试. 主要有如下API接口: 测试源码如下: #include<set> void test(){ set< ...

  2. Python运维开发基础09-函数基础

    上节作业回顾 #!/usr/bin/env python3 # -*- coding:utf-8 -*- # author:Mr.chen # 实现简单的shell命令sed的替换功能 import ...

  3. CentOS 6.5网络配置静态IP地址

    打开VMvare,并进入虚拟机 2 输入用户名,按回车键,再输入密码,登录系统 3 进行网络配置前,需要确认几个事情: 1. 网络适配器模式是否为NAT模式 右键虚拟机,或者点击VMvare菜单栏中的 ...

  4. vbs执行系统命令

    首先说明一下,我的所有代码都是vbscript,jscript我没有研究过,不过我想也差不多. 关于最基础的语法比如变量的申明,分支,循环,函数的调用,等等这些我就不讲了,不懂得自己看一下. 1.我们 ...

  5. Golang之Struct(二叉树定义)

    接招吧,看代码: package main import "fmt" //二叉树结构体 //如果每个节点有两个指针,分别用来指向左子树和右子树,我们把这样的结构叫做二叉树 type ...

  6. 配置yum源方法,以及失效时的处理

    正常方法如下: step1: 备份原CentOS-Base.repo 文件 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-B ...

  7. entity_class实体类

    对应数据库中表,并继承基础模型类~

  8. word生成包含echarts图形使用phantomjs,支持word2003,2007

    代码具体地址在我的github上 :https://github.com/HaoTwoDonkey/QuickOutPutWord 写得不好,欢迎提出问题 下面说几个phantomjs使用过程中遇到的 ...

  9. UVa 10118 Free Candies (记忆化搜索+哈希)

    题意:有4堆糖果,每堆有n(最多40)个,有一个篮子,最多装5个糖果,我们每次只能从某一堆糖果里拿出一个糖果,如果篮子里有两个相同的糖果, 那么就可以把这两个(一对)糖果放进自己的口袋里,问最多能拿走 ...

  10. Plupload 多实例上传 测试可用

    <style type="text/css"> .btn{-webkit-border-radius:3px;-moz-border-radius:3px;-ms-bo ...