Python:socket实现ftp程序

刚开始学习socket编程,还不是特熟练,码了好长时间,中间遇到许多问题,记录一下用socketserver写ftp

server端:

 1 #!/usr/bin/env python
 2
 3 import socketserver,os
 4
 5 class FTP(socketserver.BaseRequestHandler):
 6     def handle(self):
 7         def clientsend(filename):
 8             f = open(‘/ftp/%s‘ %filename,‘w‘)
 9         #    while 1:
10             data = self.request.recv(4096).decode("utf-8")
11         #    if not data:break
12             f.write(data)
13             f.close()
14             print(‘File %s  receive done!‘ % filename)
15         def clientdownload(filename):
16             f = open(‘/ftp/%s‘ %filename,‘r‘)
17             data = f.read()
18             f.close()
19             self.request.sendall(data.encode("utf-8"))
20         print(‘listening connect from:‘,self.client_address)
21         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‘
22         self.request.sendall("Welcome my ftp,input \033[34;1m‘help‘\033[0m dispaly meun".encode("utf-8"))
23         while 1:
24             try:
25                 re_msg = self.request.recv(1024).decode("utf-8")
26                 if not re_msg:break
27                 if re_msg == ‘help‘ or re_msg == ‘?‘:
28                     self.request.sendall(listmsg.encode("utf-8"))
29                 elif re_msg.split()[0] == ‘send‘:
30                     filename = re_msg.split()[1]
31                     clientsend(filename)
32                 elif re_msg.split()[0] == ‘ls‘:
33                     ls_list = os.popen(‘ls -l /ftp‘).read().encode("utf-8")
34                     self.request.sendall(ls_list)
35                 elif re_msg.split()[0] == ‘download‘:
36                     filename = re_msg.split()[1]
37                     clientdownload(filename)
38                 else:
39                     self.request.sendall(‘Invalid value‘.encode("utf-8"))
40             finally:
41                 pass
42 if __name__ == ‘__main__‘: #只有程序执行时才会触发下面的语句,程序被导入调用时,下面的语句不会触发
43     host = ‘192.168.101.128‘
44     port = 2222
45     server = socketserver.ThreadingTCPServer((host,port),FTP)
46     server.serve_forever()

client端:

 1 #!/usr/bin/env python
 2 import socket,sys
 3
 4 host = ‘192.168.101.128‘
 5 port = 2222
 6
 7 s = socket.socket()
 8 s.connect((host,port))
 9 info = s.recv(8096).decode("utf-8")
10 print(info)
11 while 1:
12     INPUT = str(input(‘input:‘))
13     if INPUT.split()[0] == ‘send‘:
14         s.send(INPUT.encode("utf-8"))
15         filename = INPUT.split()[1]
16         f = open(filename,‘r‘)
17         file_data = f.read()
18         f.close()
19         s.sendall(file_data.encode("utf-8"))
20         print(‘file sent finished!‘)
21     elif INPUT.split()[0] == ‘download‘:
22         s.send(INPUT.encode("utf-8"))
23         filename = INPUT.split()[1]
24         f = open(filename,‘w‘)
25         data = s.recv(8096).decode("utf-8")
26         f.write(data)
27         f.close()
28         print(‘%s has been download!‘ %filename)
29     elif INPUT.split()[0] == ‘exit‘:
30         sys.exit()
31     else:
32         s.send(INPUT.encode("utf-8"))
33         data = s.recv(8096).decode("utf-8")
34         print(data)
35 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

原文地址:https://www.cnblogs.com/ywxbbbbb/p/9980722.html

时间: 2024-10-12 08:40:08

Python:socket实现ftp程序的相关文章

【python练习】基于socket的FTP程序 v1.1.0(支持并发)

增加功能 1.在FTP(1.0.0)的基础上,支持了多并发的功能 2.允许配置最大并发数,比如允许只有10个并发用户 程序功能: 本程序模拟实现了一个FTP程序: 1.程序分为客户端和服务端 2.用户可以登录和注册账号,登录密码有MD5加密 3.每个用户有自己的家目录 ,且只能访问自己的家目录 4.用户可以随意切换目录(仅限自己的家目录) 5.允许用户查看当前目录下文件 6.允许上传和下载文件,保证文件一致性(md5),(不允许下载/上传文件夹,会出现不可恢复bug,用户配置文件需要重置.时间原

python之FTP程序(支持多用户在线)

转发注明出处:http://www.cnblogs.com/0zcl/p/6259128.html,这次博客写了很久~~ 一.需求 1. 用户加密认证 (完成)2. 允许同时多用户登录 (完成)3. 每个用户有自己的家目录 ,且只能访问自己的家目录(完成)4. 对用户进行磁盘配额,每个用户的可用空间不同(完成)5. 允许用户在ftp server上随意切换目录cd(完成)6. 允许用户查看当前目录下文件ls(完成)7. 允许上传put和下载get文件(完成),保证文件一致性(此需求不做)8. 文

Python开发程序:支持多用户在线的FTP程序

作业:开发一个支持多用户在线的FTP程序 要求: 用户加密认证 允许同时多用户登录 每个用户有自己的家目录 ,且只能访问自己的家目录 对用户进行磁盘配额,每个用户的可用空间不同 允许用户在ftp server上随意切换目录 允许用户查看当前目录下文件 允许上传和下载文件,保证文件一致性 文件传输过程中显示进度条 附加功能:支持文件的断点续传(仅下载) 程序 1.最最重要的readme: ### 作者介绍: * author:lzl ### 博客地址: * http://www.cnblogs.c

Python Socket 编程——聊天室演示样例程序

上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和client的代码了解主要的 Python Socket 编程模型.本文再通过一个样例来加强一下对 Socket 编程的理解. 聊天室程序需求 我们要实现的是简单的聊天室的样例,就是同意多个人同一时候一起聊天.每一个人发送的消息全部人都能接收到,类似于 QQ 群的功能,而不是点对点的 QQ 好友之间的聊天.例如以下图: 图来自:http://www.ibm.com/developerworks/linux/tu

Python核心编程(第3版)-客户端FTP程序示例

cat getLatestFTP.py #!/usr/bin/python import ftplib import os import socket HOST = 'ftp.mozilla.org' DIRN = 'pub/mozilla.org/webtools' FILE = 'bugzilla-LATEST.tar.gz' def main():     try:         f = ftplib.FTP(HOST)     except (socket.error,socket.g

Python Socket 编程——聊天室示例程序

原文:Python Socket 编程--聊天室示例程序 上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和客户端的代码了解基本的 Python Socket 编程模型.本文再通过一个例子来加强一下对 Socket 编程的理解. 聊天室程序需求 我们要实现的是简单的聊天室的例子,就是允许多个人同时一起聊天,每个人发送的消息所有人都能接收到,类似于 QQ 群的功能,而不是点对点的 QQ 好友之间的聊天.如下图: 图来自:http://www.ibm.com/de

socket&socket实现ftp的get方法、socketserver

首先了解socket工作原理,client-server模式 1.socket客户端: 2.socket类型 3.socket数据流 4.实验 (1)写一个client 服务端启动监听ip和端口 admindeMacBook-Air-62:~ admin$ nc -l 1234 客户端连接服务端,发数据,关闭socket pycharm中添加一个socket_client.py并之行: import socket HOST = '127.0.0.1' PORT = 1234 s = socket

python作业简单FTP(第七周)

作业需求: 1. 用户登陆 2. 上传/下载文件 3. 不同用户家目录不同 4. 查看当前目录下文件 5. 充分使用面向对象知识 思维图: 待补充()  思维分析: 1.用户登陆保存到文件对比用户名密码 2.上传用json序列化文件名,文件路径,文件大小传给服务器端.根据得到的字段内容操作上传动作 3.下载代码和上传基本可以互换,因为文件名都一样所以传一个文件大小即可 4.查看当前目录下文件,调用cd命令,既然能分解get 和put动作就可以看cd动作 5.添加了LINUX和Windows不同系

开发一个支持多用户在线的FTP程序

一,项目题目:开发一个支持多用户在线的FTP程序 二,项目要求: 1.用户加密认证 2.允许同时多用户登录 3.每个用户有自己的家目录 ,且只能访问自己的家目录 4.对用户进行磁盘配额,每个用户的可用空间不同 5.允许用户在ftp server上随意切换目录 6.允许用户查看当前目录下文件 7.允许上传和下载文件,保证文件一致性(md5) 8.文件传输过程中显示进度条 9.附加功能:支持文件的断点续传 三,注意事项: 基本要求. 完成1,2,3,5,6,7,8 实力选手. 完成 上条 及需求4