总结

使用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. PHP之基本目录操作

    一.创建目录 mkdir ($pathname, $mode = 0777, $recursive = false, $context = null) $pathname: 目录路径 $mode : ...

  2. (转)CocoaPods

    本文转自http://nshipster.cn/cocoapods/ 文明是建立在道路,桥梁,运河,下水道,管线,电线和光纤这些基础设施之上的.只要设计和施工得当,它们可以帮助社会成倍的发展. 唯一的 ...

  3. static关键字 详解

    原文地址:http://blog.csdn.net/keyeagle/article/details/6708077 google了近三页的关于C语言中static的内容,发现可用的信息很少,要么长篇 ...

  4. poj 3104 晾衣服问题 最大化最小值

    题意:n件衣服各含有ai水分,自然干一分钟一个单位,放烘干机一分钟k个单位,问:最短时间? 思路: mid为最短时间 如果 a[i]-mid>0说明需要放入烘干机去烘干 烘干的时间为x  那么满 ...

  5. poj1142 Smith Numbers

    Poj1142 Smith Numbers Smith Numbers Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 13854 ...

  6. CSU 1326: The contest(分组背包)

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1326 题意: n个题目,每个题目都有一个价值Pi和相对能力消耗Wi,但是有些题目因为太坑不能同时做 ...

  7. 1 django

    1.MVC 大部分开发语言中都有MVC框架 MVC框架的核心思想是:解耦 降低各功能模块之间的耦合性,方便变更,更容易重构代码,最大程度上实现代码的重用 m表示model,主要用于对数据库层的封装 v ...

  8. Python中*和**的区别

    Python中,(*)会把接收到的参数形成一个元组,而(**)则会把接收到的参数存入一个字典 我们可以看到,foo方法可以接收任意长度的参数,并把它们存入一个元组中 >>> def ...

  9. 谋哥:《App自推广》连载2直立人行走迁徙

    [谋哥每天一干货,第六十九篇] 前篇说到声音在远古时代,是一个神奇的东西,它能够很快地把信息传播到其他地方,突破了短距离.然而能人的后代直立人学会了直立行走,他们开始走出非洲,到达遥远的中东.中国,还 ...

  10. Leetcode 567.字符串的排列

    字符串的排列 给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列. 换句话说,第一个字符串的排列之一是第二个字符串的子串. 示例1: 输入: s1 = "ab&q ...