Python:socket实现ftp程序
刚开始学习socket编程,还不是特熟练,码了好长时间,中间遇到许多问题,记录一下用socketserver写ftp
server端:
#!/usr/bin/env python import socketserver,os class FTP(socketserver.BaseRequestHandler):
def handle(self):
def clientsend(filename):
f = open('/ftp/%s' %filename,'w')
# while 1:
data = self.request.recv(4096).decode("utf-8")
# if not data:break
f.write(data)
f.close()
print('File %s receive done!' % filename)
def clientdownload(filename):
f = open('/ftp/%s' %filename,'r')
data = f.read()
f.close()
self.request.sendall(data.encode("utf-8"))
print('listening connect from:',self.client_address)
listmsg = 'list:\n1.help\t\t\tdispaly the list\n2.send file\t\tsend + filename\n3.download file\t\tdownload + filename\n4.ls\t\t\tShow files and permissions\n5.exit\n'
self.request.sendall("Welcome my ftp,input \033[34;1m'help'\033[0m dispaly meun".encode("utf-8"))
while 1:
try:
re_msg = self.request.recv(1024).decode("utf-8")
if not re_msg:break
if re_msg == 'help' or re_msg == '?':
self.request.sendall(listmsg.encode("utf-8"))
elif re_msg.split()[0] == 'send':
filename = re_msg.split()[1]
clientsend(filename)
elif re_msg.split()[0] == 'ls':
ls_list = os.popen('ls -l /ftp').read().encode("utf-8")
self.request.sendall(ls_list)
elif re_msg.split()[0] == 'download':
filename = re_msg.split()[1]
clientdownload(filename)
else:
self.request.sendall('Invalid value'.encode("utf-8"))
finally:
pass
if __name__ == '__main__': #只有程序执行时才会触发下面的语句,程序被导入调用时,下面的语句不会触发
host = '192.168.101.128'
port = 2222
server = socketserver.ThreadingTCPServer((host,port),FTP)
server.serve_forever()
client端:
#!/usr/bin/env python
import socket,sys host = '192.168.101.128'
port = 2222 s = socket.socket()
s.connect((host,port))
info = s.recv(8096).decode("utf-8")
print(info)
while 1:
INPUT = str(input('input:'))
if INPUT.split()[0] == 'send':
s.send(INPUT.encode("utf-8"))
filename = INPUT.split()[1]
f = open(filename,'r')
file_data = f.read()
f.close()
s.sendall(file_data.encode("utf-8"))
print('file sent finished!')
elif INPUT.split()[0] == 'download':
s.send(INPUT.encode("utf-8"))
filename = INPUT.split()[1]
f = open(filename,'w')
data = s.recv(8096).decode("utf-8")
f.write(data)
f.close()
print('%s has been download!' %filename)
elif INPUT.split()[0] == 'exit':
sys.exit()
else:
s.send(INPUT.encode("utf-8"))
data = s.recv(8096).decode("utf-8")
print(data)
s.close()
socket 仅支持单线程,socketserver 支持多线程
socketserver(支持多线程!):
定义请求处理类时,需要继承socketserver.BaseRequestHandler,并且需要创建新的handle()函数来处理请求
python中的socketserver模块已经为我们初始化好了,直接调用即可
self.request.recv(bufsize).decode("utf-8") 读取请求数据
self.request.sendall().encode("utf-8") 发送数据
self.client_address 客户端请求的地址
server = socketserver.ThreadingTCPServer((Host,Port),FTP) 多线程!!!
server = socketserver.TCPServer((Host,Port),FTP) 单线程
server.serve_forever() 持续监听,服务端一直运行,知道收到shutdown信号
socket(仅支持单线程):
socket.AF_UNIX 只能用于单一的Unix系统进程通信
socket.AF_INET 服务器之间网络通信
socket.AF_INET6 IPv6
socket.SOCK_STREAM 流式socket,for TCP
socket.SOCK_DGRAM 数据报式socket,for UDP
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind((Host,Port))
s.listen()
s.connect((Host,Port))
conn,address = s.accept() conn是新的套接字对象,可以用来接受和发送数据,address是客户端的地址
s.close()
s.recv(bufsize) 接受套接字的数据,数据以字符串的形式返回,bufsize是接收的最大数据量
s.sendall(string) 尝试发送所有数据,成功返回None,失败则抛出异常
s.getpeername() 返回连接套接字的远程地址,返回值通常为元组
s.gettimeout() 返回当前超时值,单位为秒,如果没有设置超时,则为None
Python:socket实现ftp程序的更多相关文章
- 用python开发简单ftp程序
		根据alex老师视频开发的简单ftp程序,只能实现简单的get功能 ftp客户端程序: #!/usr/bin/env python #_*_ coding:utf-8 _*_ import socke ... 
- 使用socket实现FTP程序
		#-*- coding:utf-8 -*- import socketserver from module import * class server: def __init__(self,reque ... 
- Python socket聊天室程序
		http://blog.csdn.net/calling_wisdom/article/details/42524745 今天用python的socket模块实现了一个聊天室的程序 虽然功能比较简单, ... 
- python简单的ftp程序
		服务器端 '''1.读取文件名2.检测文件是否存在3.打开文件4.检测文件大小5.发送文件大小给客户端6.等客户端确认7.开始边读边发数据8.发送md5'''import socket,os,time ... 
- Python开发程序:FTP程序
		作业:开发一个支持多用户在线的FTP程序 要求: 用户加密认证 允许同时多用户登录 每个用户有自己的家目录 ,且只能访问自己的家目录 对用户进行磁盘配额,每个用户的可用空间不同 允许用户在ftp se ... 
- python之FTP程序(支持多用户在线)
		转发注明出处:http://www.cnblogs.com/0zcl/p/6259128.html 一.需求 1. 用户加密认证 (完成)2. 允许同时多用户登录 (完成)3. 每个用户有自己的家目录 ... 
- python实现FTP程序
		python实现FTP程序 程序源码 上传功能 查看文件 cd功能 创建目录 程序源码 目录结构 服务端 主程序 import optparse import socketserver import ... 
- (转)Python开发程序:支持多用户在线的FTP程序
		原文链接:http://www.itnose.net/detail/6642756.html 作业:开发一个支持多用户在线的FTP程序 要求: 用户加密认证 允许同时多用户登录 每个用户有自己的家目录 ... 
- [ python ] 项目一:FTP程序
		声明: 该项目参考学习地址: http://www.cnblogs.com/lianzhilei/p/5869205.html , 感谢博主分享,如有侵权,立即删除. 作业:开发一个支持多用户在线的F ... 
随机推荐
- bzoj 2528: [Poi2011]Periodicity【kmp+构造】
			神仙构造,做不来做不来 详见:http://vfleaking.blog.163.com/blog/static/174807634201329104716122/ #include<iostr ... 
- C#课程设计
			一.问题描述 监视文件和文件夹的变化(FileSystemWatcher 类):选择一个文件夹,单击"开始监视",该文件夹处于监视状态,此时对该文件夹如果进行操作,这些行为将显示出 ... 
- 【转载】WebConfigurationManager和ConfigurationManager
			原文链接 今天在写程序时偶然发现有的示例代码中是用WebConfigurationManager获取web.config中的配置信息的,因为之前一直都是用的ConfigurationManager,所 ... 
- orcl 11g 创建表空间
			Oracle11g创建表空间语句 在plsql工具中执行以下语句,可建立Oracle表空间. /*分为四步 *//*第1步:创建临时表空间 */create temporary tablespa ... 
- 移动端UI自动化Appium测试——Windows系统Appium环境配置
			1.安装JDK,官网下载即可,这里用的1.8,环境变量配置 2.安装Android sdk,API >= 17,环境变量配置 3.安装Nodejs,官网http://nodejs.org/dow ... 
- XML To Linq 读取Sharepoint列表中的附件列信息
			通过页面查看,列表附件信息列的内容如下: var x = @"<div class='ExternalClass9936DCD1F074427B891D09CFCEFC2AB6'> ... 
- JS filters-table简单过滤-Version 1
			初级版本: 输入框可检索,空格检索忽略 radio点击后会过滤 最后的两个输入框可根据age范围检索过滤 三个单独的功能,不能协同工作 <!DOCTYPE html> <html&g ... 
- 最实用解决tomcat startup.bat 一闪而过
			1.直接到tomcat 的解压路径中找到log日志,eg:D:\tomcat\apache-tomcat-7.0.73\logs 查看 catalina 这个日志文件,可以清除的定位错误原因:一般可能 ... 
- rem手机端页面自适应完美解决方案(最新)
			<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ... 
- windows ubuntu bcdeditor
			双系统. 先装windows,后装ubuntu12.04 为了避免grub引导,所以安装bcdeditor. 平时使用没有什么不适,可是每次linux升级内核以后,grub列表可能就会消失,自然是不能 ... 
