设为首页 收藏本站
查看: 1089|回复: 0

[经验分享] Python socket Ftp get put 简单实现

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-9-9 09:03:11 | 显示全部楼层 |阅读模式
客户端
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os

__author__ = 'gaogd'


import socket

class FTP(object):
    def __init__(self,host,port):
        self.host = host
        self.port = port

    def put(self,msg):    ###上传文件到服务端
        print 'going to send file:%s to client' % msg[0]
        filename = msg[0]
        if os.path.isfile(filename):
            file_size = os.path.getsize(filename)
            ack_msg = "file_transter|put|%s" % (filename)
            print "ack_msg >>>>>>",ack_msg
            self.sock.send(ack_msg)
            client_file = self.sock.recv(1024)
            if client_file.startswith("file_transfer|put|recv|%s" %filename):
                ack_msg_size = "file_transfer|put|recv|%s|%s" %(filename,file_size)
                self.sock.send(ack_msg_size)
                print "ack_msg_size>>>",ack_msg_size
            else:
                print 'server not ready recv'
                return False
            # print '---->client_acl: ', client_ack
            client_ack = self.sock.recv(1024)
            if client_ack.startswith("file_transfer|put|recv|ready"):     ## 如果服务器通过这个,那就是说明服务端已经做好接收的准备了
                f = file(filename, 'rb')
                for line in f:
                    self.sock.send(line)    ##发文件
                else:
                    print '--file %s send done' % filename
                    f.close()

        else:
            ack_msg = "file_transfer|get|file doesn't exist"
            self.sock.send(ack_msg)



    def get(self,msg):     ##从服务端中下载内容
        print 'get:: ',msg
        if len(msg) > 0:       ##判断 get 后面是否接文件名
            remote_filename = msg[0]
            cmd_msg="file_transter|get|%s" % remote_filename
            self.sock.send(cmd_msg)
            #print cmd_msg
            feedback = self.sock.recv(1024)
            print '---feedback',feedback
            if feedback.startswith("file_transter1|get|ready"):
                file_size = int(feedback.split('|')[-1])
                ack_msg = "file_transfer|get|recv|ready"
                self.sock.send(ack_msg)

                f = file('recv/%s' % remote_filename,'wb')
                recv_size = 0

                while not file_size == recv_size:
                    if file_size - recv_size > 1024:
                        data = self.sock.recv(1024)
                        f.write(data)
                        recv_size +=len(data)
                    else:
                        data = self.sock.recv(file_size - recv_size)
                        recv_size += file_size - recv_size
                    f.write(data)
                    #print '--->',file_size,recv_size
                else:
                    f.close()
                    print feedback
            else:
                print 'test'

    def list_file(self):
        pass

    def interactive(self):
        while True:
            user_input = raw_input('ftp_client::').strip()
            if len(user_input) == 0:
                continue
            cmd = user_input.split()
            if hasattr(self,cmd[0]):
                func = getattr(self,cmd[0])  ## put |get |list_file
                func(cmd[1:])
            else:
                print "\033[31;1m Wrong cmd usage !\033[0m"

    def connect(self):
        self.sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        self.sock.connect((self.host,self.port ))
        self.interactive()

if __name__ == '__main__':
    ftp = FTP('127.0.0.1',50018)
    ftp.connect()




服务端

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#!/usr/bin/python
# -*- coding: utf-8 -*-

__author__ = 'gaogd'

import  os
import SocketServer
class MyTCPHandler(SocketServer.BaseRequestHandler):
    """
    The RequestHandler class for our server.
It is instantiated once per connection to the server,
and must override the handle() method to implement communication
to the client.
    """
    def handle(self):

        while True:
            data = self.request.recv(1024).strip()
            data = data.split("|")
            print data
            if hasattr(self,data[0]):
                func = getattr(self,data[0])
                func(data[1:])

    def file_transter(self,msg):
        # print msg[0]
        if msg[0] == 'get':
            print 'going to send file:%s to client' % msg[1]
            filename = msg[1]
            if os.path.isfile(filename):
                file_size = os.path.getsize(filename)
                ack_msg = "file_transter1|get|ready|%s" % file_size
                self.request.send(ack_msg)
                client_ack = self.request.recv(1024)
                #print '---->client_acl: ', client_ack
                if client_ack.startswith("file_transfer|get|recv|ready"):
                    f = file(filename,'rb')
                    for line in f:
                        self.request.send(line)
                    else:
                        print '--file %s send done'% filename
                        f.close()

            else:
                ack_msg= "file_transfer|get|file doesn't exist"
                self.request.send(ack_msg)
##############################################################################

        if msg[0] == 'put':     ##接收客户端上传过来的文件
            print 'put:: ', msg[1]
            if len(msg[1]) > 0 :             ###判断 get 后面是否接文件名,如果不存在,那就是命令有问题
                remote_filename = msg[1]
                cmd_msg = "file_transfer|put|recv|%s" % remote_filename
                print 'cmd_msg>>>>',cmd_msg
                self.request.send(cmd_msg)    ## 告诉客户端已经准备好接收了
                feedback = self.request.recv(1024)

                print '---feedback', feedback

                if feedback.startswith("file_transfer|put|recv"):
                    file_size = int(feedback.split('|')[-1])
                    ack_msg = "file_transfer|put|recv|ready"
                    self.request.send(ack_msg)     ## 告诉客户端已经做好准备接收了

                    f = file('recv/%s' % remote_filename, 'wb')
                    recv_size = 0

                    while not file_size == recv_size:
                        if file_size - recv_size > 1024:
                            data = self.request.recv(1024)
                            f.write(data)
                            recv_size += len(data)
                        else:
                            data = self.request.recv(file_size - recv_size)
                            recv_size += file_size - recv_size
                        f.write(data)
                        #print '--->',file_size,recv_size
                    else:
                        f.close()
                        print feedback
                else:
                    print 'put filename is not '


if __name__ == "__main__":
    #HOST, PORT = "localhost", 9999
    HOST, PORT = "localhost", 50018

    # Create the server, binding to localhost on port 9999

    server = SocketServer.ThreadingTCPServer((HOST, PORT), MyTCPHandler)

    # Activate the server; this will keep running until you
    # interrupt the program with Ctrl-C

    server.serve_forever()






运维网声明 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-269675-1-1.html 上篇帖子: python内置函数和条件判断 下篇帖子: CentOS 6.5安装python3.3.4
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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