设为首页 收藏本站
查看: 1219|回复: 1

[经验分享] python简易FTP服务器

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2017-9-18 10:17:24 | 显示全部楼层 |阅读模式
功能描述:实现简单的文件上传和下载功能
程序分三部分:
① ftp_opr.py    上传下载功能,需与其他程序在一起
② ftp_server.py    服务端程序
③ ftp_client.py    客户端程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#filename:ftp_opr.py
import socket,os,json

def send_file(socket_object,filename):      ####传入套接字对象和文件名,下同
    fk = open(filename, 'rb')
    file_size = os.path.getsize(filename)
    dict = {'filename':filename,'file_size':file_size}
    socket_object.send(json.dumps(dict).encode('utf-8'))
    print('准备发送的文件名:',dict['filename'],'文件大小:',dict['file_size'])
    socket_object.recv(1024)  ####等待一个save_file发过来的无用信号,用于防止粘包
    socket_object.send(fk.read())
    fk.close()

def save_file(socket_object,filename):
    name_size_dict = json.loads(socket_object.recv(1024).decode('utf-8'))
    print('准备接收的文件名:',name_size_dict['filename'],'文件大小:', name_size_dict['file_size'])
    socket_object.send(b'ready')  ####发送一个无用的信号,用于防止粘包
    #filename = name_size_dict['filename']    ####调用该方法需要输入filename参数,同时传过来的dict中已经包含filename,所以忽略其一
    file_size = name_size_dict['file_size']
    fk = open(filename+'.new', 'wb')
    receive_size = 0
    while file_size > receive_size:
        data = socket_object.recv(1024)
        fk.write(data)
        receive_size += len(data)
        print(len(data), receive_size, file_size)
    print('文件接收完毕!')
    fk.close()



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#filename:ftp_server.py
from ftp_opr import send_file,save_file
def ftp_server():
    sk = socket.socket()
    sk.bind(('0.0.0.0',9999))    ####绑定本机网卡地址和端口
    sk.listen()
    while True:
        conn,addr = sk.accept()
        print('新的连接:',addr)
        while True:
            cmd = conn.recv(1024).decode('utf-8')
            if len(cmd) == 0:
                print('客户端断开了')
                break
            elif cmd.split()[0] == 'get':    ####对应客户端下载功能
                filename= cmd.split()[1]
                print(cmd)
                send_file(conn, filename)
            elif cmd.split()[0] == 'put':    ####对应客户端上传功能
                filename= cmd.split()[1]
                print(cmd)
                save_file(conn, filename)
            else:
                '''保留功能部分'''
                pass
    sk.close()
if __name__ == '__main__':
    ftp_server()



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#filename:ftp_client.py
import socket,os,json
from ftp_opr import send_file,save_file
def ftp_client():
    sk = socket.socket()
    sk.connect(('127.0.0.1',9999))    ####连接服务器地址和端口
    while True:
        cmd = input('>>>:')
        if len(cmd) == 0:continue
        elif cmd == 'q':
            exit()
        elif len(cmd.split()) > 2:
            print('输入参数过多,请使用 put/get + 1个文件名')

        elif cmd.split()[0] == 'get':    ####下载功能
            filename= cmd.split()[1]
            sk.send(bytes(cmd.encode('utf-8')))
            save_file(sk, filename)

        elif cmd.split()[0] == 'put':    ####下载功能
            filename= cmd.split()[1]
            sk.send(bytes(cmd.encode('utf-8')))
            send_file(sk, filename)

        else:
            print('输入错误,请输入 put/get + 文件名')
            pass
    sk.close()

if __name__ == '__main__':
    ftp_client()



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-404669-1-1.html 上篇帖子: python之文件的基本操作 下篇帖子: python 采用 BoundedSemaphore 限制多进程访问qps
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表