总结

使用Python的socket和socketserver模块实现ftp文件服务器。不是很难,但在粘包的问题上纠缠了不少时间。解决办法是发送文件信息之后等待一段时间。

 #!/usr/bin/python
#coding:utf-8
'''
ftp文件上传 服务器端
''' import socketserver
import os class myFtpServer(socketserver.BaseRequestHandler):
def setup(self):
pass def handle(self):
dir = r'F:\temp' #存放接收文件的目录 print('Connected %s:%d' %self.client_address)
while True: #持续接收文件
#接收文件的名称和大小
fileInfo = self.request.recv(1024)
if fileInfo.decode('utf-8') == 'exit':
break
filename, filesize = fileInfo.decode('utf-8').strip().split('|')
filePath = os.path.join(dir, filename) #创建文件存放路径
print('Receiving file:%s, filesize:%s'%(filename, filesize))
with open(filePath, 'wb') as f:
recvsize = 0
while True: #持续接收文件内容
if recvsize == int(filesize): #当接收的大小与文件大小相等时结束接收
break
self.data = self.request.recv(1024)
recvsize += len(self.data)
f.write(self.data)
print('upload succeed!!')
print(recvsize)
print('Disconnected %s:%d.' %self.client_address)
'''
def handle(self):
base_path = ''
conn = self.request
print( 'connected...')
while True:
pre_data = conn.recv(1024)
#获取请求方法、文件名、文件大小
file_name,file_size = pre_data.decode('utf-8').split('|') #已经接收文件的大小
recv_size = 0
#上传文件路径拼接
file_dir = os.path.join(base_path,file_name)
f = open(file_dir,'wb')
Flag = True
while Flag:
#未上传完毕,
if int(file_size)>recv_size:
#最多接收1024,可能接收的小于1024
data = conn.recv(1024)
recv_size+=len(data)
#上传完毕,则退出循环
else:
recv_size = 0
Flag = False
#写入文件
f.write(data)
print('upload successed.')
f.close()
def finish(self):
pass '''
if __name__ == '__main__':
addr = ('127.0.0.1', 9999)
sk = socketserver.ThreadingTCPServer(addr, myFtpServer)
sk.serve_forever()
 #!/usr/bin/python
#coding:utf-8
'''
ftp文件上传 客户端
'''
import socket
import sys
import os
import time def ftp(address):
sk = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
sk.connect(address)
while True:
#filePath = r'C:\Users\admin\Desktop\test'
filePath = input('Input file path:')
if filePath == 'exit': #判断退出
sk.send(b'exit')
break
if not os.path.isfile(filePath): #判断是否文件
print('Not available file path...')
continue
filename = os.path.basename(filePath)
#dir = os.path.dirname(filePath) filesize = os.stat(filePath).st_size #获取文件大小
fileInfo = '%s|%s'%(filename, filesize) #重新组织文件信息,包括文件名和文件大小,用‘|’分割 #发送文件信息
sk.send(fileInfo.encode(encoding='utf-8', errors='strict'))
time.sleep(0.01) #为了防止粘包,在文件信息发送之后等待0.01秒 #持续发送文件内容
with open(filePath, 'rb') as f:
sendsize = 0
flag = True
while flag:
if sendsize + 1024 > filesize: #判断最后一份文件内容的读取
data = f.read(filesize - sendsize)
flag = False
else: #一般文件内容的读取
data = f.read(1024)
sendsize += 1024
sk.send(data) sk.close() if __name__ == '__main__':
addr = ('127.0.0.1',9999)
ftp(addr)

环境:python3.5 win10 x64

FTP上传文件服务器python实现的更多相关文章

  1. FTP上传下载--python

    import socket import struct import json import subprocess import os class MYTCPServer: address_famil ...

  2. python之实现ftp上传下载代码(含错误处理)

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python之实现ftp上传下载代码(含错误处理) #http://www.cnblogs.com/kait ...

  3. python之模块ftplib(实现ftp上传下载代码)

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python之模块ftplib(实现ftp上传下载代码) #需求:实现ftp上传下载代码(不含错误处理) f ...

  4. 【Python学习 】Python实现的FTP上传和下载功能

    一.背景 最近公司的一些自动化操作需要使用Python来实现FTP的上传和下载功能.因此参考网上的例子,撸了一段代码来实现了该功能,下面做个记录. 二.ftplib介绍 Python中默认安装的ftp ...

  5. python 网络编程粘包解决方案2 + ftp上传 + socketserver

    一.struct 神奇的打包工具 struct 代码: import struct num = 156 #将int类型的数据打包成4个字节的数据 num_stru = struct.pack('i', ...

  6. python socketserver ftp上传功能

    一.socketserver用于多个客户端访问同一个服务端 客户端 import socket client = socket.socket() ip_port = ('127.0.0.1',8001 ...

  7. 在附件管理模块中增加对FTP 上传和预览的支持

    在之前介绍的附件管理模块里面<Winform开发框架之通用附件管理模块>以及<Winform开发框架之附件管理应用>,介绍了附件的管理功能,通过对数据库记录的处理和文件的管理, ...

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

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

  9. .net FTP上传文件

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

随机推荐

  1. JZOJ 5196. 【NOIP2017提高组模拟7.3】B

    5196. [NOIP2017提高组模拟7.3]B Time Limits: 1000 ms  Memory Limits: 262144 KB  Detailed Limits   Goto Pro ...

  2. Tempter of the Bone HDU - 1010(dfs)

    Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  3. XmlSerializer 短信备份

    package com.itheima.mobileguard.utils; import java.io.File; import java.io.FileNotFoundException; im ...

  4. mongoTemplate聚合操作Demo

    package com.tangzhe.mongodb.mongotemplate; import com.mongodb.BasicDBObject; import com.mongodb.DBOb ...

  5. 某面试公司出的面试题---用JS比较两个版本号高低

    一天中午某个公司给我反馈的面试题,说,比较两个文件的版本号,然后我给发过去了,说我的代码不符合他的要求,o(╯□╰)o了var compareVersion = compareVersion||fun ...

  6. Android TV 开发(2)

    本文来自网易云社区 作者:孙有军 首先来看看拨号界面的配置代码: <LinearLayout xmlns:android="http://schemas.android.com/apk ...

  7. java包、类、方法、属性、常量命名规则

    必须用英文,不要用汉语拼音 1:包(package):用于将完成不同功能的类分门别类,放在不同的目录(包)下,包的命名规则:将公司域名反转作为包名.比如www.sohu.com 对于包名:每个字母都需 ...

  8. Android 使用intent传递返回值:startActivityForResult()与onActivityResult()与setResult()参数分析,activity带参数的返回

    在一个父Activity通过intent跳转至多个不同子Activity上去,当子模块的代码执行完毕后再次返回父页面,将子activity中得到的数据显示在主界面/完成的数据交给父Activity处理 ...

  9. java中常用的几种缓存类型介绍

    在平时的开发中会经常用到缓存,比如locache.redis等,但一直没有对缓存有过比较全面的总结.下面从什么是缓存.为什么使用缓存.缓存的分类以及对每种缓存的使用分别进行分析,从而对缓存有更深入的了 ...

  10. github 上传项目

    注册账户以及创建仓库 要想使用github第一步当然是注册github账号了.之后就可以创建仓库了(免费用户只能建公共仓库),Create a New Repository,填好名称后Create,之 ...