ftpServer.py

 import socket
import threading
import os
import struct #用户账号、密码、主目录
#也可以把这些信息存放到数据库中
users = {'zhangsan':{'pwd':'zhangsan1234', 'home':r'c:\python 3.5'},
'lisi':{'pwd':'lisi567', 'home':'c:\\'}} def server(conn,addr, home):
print('新客户端:'+str(addr))
#进入当前用户主目录
os.chdir(home)
while True:
data = conn.recv(100).decode().lower()
#显示客户端输入的每一条命令
print(data)
#客户端退出
if data in ('quit', 'q'):
break
#查看当前文件夹的文件列表
elif data in ('list', 'ls', 'dir'):
files = str(os.listdir(os.getcwd()))
files = files.encode()
conn.send(struct.pack('I', len(files)))
conn.send(files)
#切换至上一级目录
elif ''.join(data.split()) == 'cd..':
cwd = os.getcwd()
newCwd = cwd[:cwd.rindex('\\')]
#考虑根目录的情况
if newCwd[-1] == ':':
newCwd += '\\'
#限定用户主目录
if newCwd.lower().startswith(home):
os.chdir(newCwd)
conn.send(b'ok')
else:
conn.send(b'error')
#查看当前目录
elif data in ('cwd', 'cd'):
conn.send(str(os.getcwd()).encode())
elif data.startswith('cd '):
#指定最大分隔次数,考虑目标文件夹带有空格的情况
#只允许使用相对路径进行跳转
data = data.split(maxsplit=1)
if len(data) == 2 and os.path.isdir(data[1]) \
and data[1]!=os.path.abspath(data[1]):
os.chdir(data[1])
conn.send(b'ok')
else:
conn.send(b'error')
#下载文件
elif data.startswith('get '):
data = data.split(maxsplit=1)
#检查文件是否存在
if len(data) == 2 and os.path.isfile(data[1]):
conn.send(b'ok')
fp = open(data[1], 'rb')
while True:
content = fp.read(4096)
#发送文件结束
if not content:
conn.send(b'overxxxx')
break
#发送文件内容
conn.send(content)
if conn.recv(10) == b'ok':
continue
fp.close()
else:
conn.send(b'no')
#无效命令
else:
pass conn.close()
print(str(addr)+'关闭连接') #创建Socket,监听本地端口,等待客户端连接
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('', 10600))
sock.listen(5)
while True:
conn, addr = sock.accept()
#验证客户端输入的用户名和密码是否正确
userId, userPwd = conn.recv(1024).decode().split(',')
if userId in users and users[userId]['pwd'] == userPwd:
conn.send(b'ok')
#为每个客户端连接创建并启动一个线程,参数为连接、客户端地址、客户主目录
home = users[userId]['home']
t = threading.Thread(target=server, args=(conn,addr,home))
t.daemon = True
t.start()
else:
conn.send(b'error')

ftpClient.py

 import socket
import threading
import os
import struct #用户账号、密码、主目录
#也可以把这些信息存放到数据库中
users = {'zhangsan':{'pwd':'zhangsan1234', 'home':r'c:\python 3.5'},
'lisi':{'pwd':'lisi567', 'home':'c:\\'}} def server(conn,addr, home):
print('新客户端:'+str(addr))
#进入当前用户主目录
os.chdir(home)
while True:
data = conn.recv(100).decode().lower()
#显示客户端输入的每一条命令
print(data)
#客户端退出
if data in ('quit', 'q'):
break
#查看当前文件夹的文件列表
elif data in ('list', 'ls', 'dir'):
files = str(os.listdir(os.getcwd()))
files = files.encode()
conn.send(struct.pack('I', len(files)))
conn.send(files)
#切换至上一级目录
elif ''.join(data.split()) == 'cd..':
cwd = os.getcwd()
newCwd = cwd[:cwd.rindex('\\')]
#考虑根目录的情况
if newCwd[-1] == ':':
newCwd += '\\'
#限定用户主目录
if newCwd.lower().startswith(home):
os.chdir(newCwd)
conn.send(b'ok')
else:
conn.send(b'error')
#查看当前目录
elif data in ('cwd', 'cd'):
conn.send(str(os.getcwd()).encode())
elif data.startswith('cd '):
#指定最大分隔次数,考虑目标文件夹带有空格的情况
#只允许使用相对路径进行跳转
data = data.split(maxsplit=1)
if len(data) == 2 and os.path.isdir(data[1]) \
and data[1]!=os.path.abspath(data[1]):
os.chdir(data[1])
conn.send(b'ok')
else:
conn.send(b'error')
#下载文件
elif data.startswith('get '):
data = data.split(maxsplit=1)
#检查文件是否存在
if len(data) == 2 and os.path.isfile(data[1]):
conn.send(b'ok')
fp = open(data[1], 'rb')
while True:
content = fp.read(4096)
#发送文件结束
if not content:
conn.send(b'overxxxx')
break
#发送文件内容
conn.send(content)
if conn.recv(10) == b'ok':
continue
fp.close()
else:
conn.send(b'no')
#无效命令
else:
pass conn.close()
print(str(addr)+'关闭连接') #创建Socket,监听本地端口,等待客户端连接
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('', 10600))
sock.listen(5)
while True:
conn, addr = sock.accept()
#验证客户端输入的用户名和密码是否正确
userId, userPwd = conn.recv(1024).decode().split(',')
if userId in users and users[userId]['pwd'] == userPwd:
conn.send(b'ok')
#为每个客户端连接创建并启动一个线程,参数为连接、客户端地址、客户主目录
home = users[userId]['home']
t = threading.Thread(target=server, args=(conn,addr,home))
t.daemon = True
t.start()
else:
conn.send(b'error')

Python_FTP通讯软件的更多相关文章

  1. 即时通讯软件openfire+spark+smack

    所以我基本上分为三篇文章来介绍此类软件的开发: 第一篇是关于XMPP 协议是啥,IM 是啥以及一个比较有名的开源实现,该开源实现包括三个部分(Spark.Smack和Openfire): 第二篇讲如何 ...

  2. 【即时通讯】即时通讯及XMPP概述及…

    在讲解XMPP前,我们需要先了解什么是即时通讯技术: * 即时通讯技术(IM - InstantMessaging)支持用户在线实时交谈.当一方需要发送消息时,用户必须打开一个窗口,以便让用户与交流对 ...

  3. IM即时通讯实现原理

      即时通讯(Instant Messenger,简称IM)软件多是基于TCP/IP和UDP进行通讯的,TCP/IP和UDP都是建立在更低层的IP协议上的两种通讯传输协议.前 者是以数据流的形式,将传 ...

  4. [转载]QQ通讯原理及QQ是怎么穿透内网的

    QQ是一个基于TCP/UDP协议的通讯软件 发送消息的时候是UDP打洞,登陆的时候使用HTTP~因为登陆服务器其实就是一个HTTP服务器,只不过不是常用的那些,那个服务器是腾讯自行开发的!!! 一.登 ...

  5. 工具武装的前端开发工程师 Mac 软件清单

    Awesome Mac  这个仓库主要是收集非常好用的Mac应用程序.软件以及工具,主要面向开发者和设计师.有这个想法是因为我最近发了一篇较为火爆的涨粉儿微信公众号文章<工具武装的前端开发工程 ...

  6. QQ 腾讯QQ(简称“QQ”)是腾讯公司开发的一款基于Internet的即时通信(IM)软件

    QQ 编辑 腾讯QQ(简称“QQ”)是腾讯公司开发的一款基于Internet的即时通信(IM)软件.腾讯QQ支持在线聊天.视频通话.点对点断点续传文件.共享文件.网络硬盘.自定义面板.QQ邮箱等多种功 ...

  7. openfire+spark+smack实现即时通讯

    近公司项目需要用到即时通讯功能,经过调研发现openfire+spark+smack可以实现.在网上找了很久,资料都十分有限,即使有些朋友实现了也说的不清不楚.于是决定自己研究,耗时一周的时间实现了文 ...

  8. 新版本ubuntu13.10软件安装

    问题1:如何解决ubunt13.04不能和主机共享文件的问题 . 安装VMware Tools 网上有很多的资料,这里没有给出. . 设置共享文件夹目录 ) 在VMware虚拟机窗口,选择VM-> ...

  9. 基于Android 平台简易即时通讯的研究与设计[转]

    摘要:论文简单介绍Android 平台的特性,主要阐述了基于Android 平台简易即时通讯(IM)的作用和功能以及实现方法.(复杂的通讯如引入视频音频等可以考虑AnyChat SDK~)关键词:An ...

随机推荐

  1. Dynamics Crm2011 Removes an option from an Option Set control

    应用场景:OptionSet中有N个option值,特定的条件下需要去除某些option的显示,例如在某个条件下我要红框中的两个option不显示 var purchasetype= Xrm.Page ...

  2. 【面试笔试算法】牛客网一站通Offer编程题2016.4.19

    牛客网一站通offer (一)字符串变形 1. 题目: 对于一个给定的字符串,我们需要在线性(也就是O(n))的时间里对它做一些变形.首先这个字符串中包含着一些空格,就像"Hello Wor ...

  3. 用boost::bind构造boost::coroutine

    class TestCoro { ... typedef boost::coroutines::coroutione<void ()> Coro; void CoroFun(Coro::c ...

  4. OC中的枚举类型

    背景 一直对OC中的位移操作枚举不太理解,查找到两篇介绍OC中枚举的文章,觉得很不错. 什么是位移操作枚举呢? typedef NS_OPTIONS(NSUInteger, UIViewAutores ...

  5. Swift之GCD 使用指南2

    Grand Central Dispatch大中枢派发:joy: 或俗称 GCD 是一件极其强大的武器.它为你提供了很多底层工具(比如队列和信号量),你可以组合这些工具来实现自己想要的多线程效果.不幸 ...

  6. 10个精选的颜色选择器Javascript脚本及其jQuery插件

     Color picker即颜色选择器使我们在web开发中可能经常用到的组件,今天我们特意精选了10个超酷的颜色选择器实现,其中包括了javascript脚本 实现及其传说中的jQuery插件实现 ...

  7. android 股票K线图

    现在在手上的是一个证券资讯类型的app,其中有涉及到股票行情界面,行情中有K线图等,看到网上很多人在求这方面的资料,所以我特地写了一个demo在此处给大家分享一下. 下面是做出来的效果图: 这个 界面 ...

  8. Linux - 工作管理(job control),jobs,fg,bg,kill

    什么是工作管理? 『进行工作管理的行为中, 其实每个工作都是目前 bash 的子程序,亦即彼此之间是有相关性的. 我们无法以 job control 的方式由 tty1 的环境去管理 tty2 的 b ...

  9. OpenCV stereo matching 代码 matlab实现视差显示

    转载请注明出处:http://blog.csdn.net/wangyaninglm/article/details/44151213, 来自:shiter编写程序的艺术 基础知识 计算机视觉是一门研究 ...

  10. OpenCV——PS 图层混合算法 (二)

    具体的算法原理可以参考 PS图层混合算法之二(线性加深,线性减淡,变亮,变暗) // PS_Algorithm.h #ifndef PS_ALGORITHM_H_INCLUDED #define PS ...