• Python using socket to make an ftp client


    费了下午写了这么点东西,也是醉了。
    1. 内容主要是请求到ftp服务器,然后下载一个文件。没有实现模块化,只是简单的实现了。(这都哭了)
    2. 遇到的问题:对于 ftp需要的两个请求没有清楚和对ftp服务器的机制没有弄清楚
    3. 在代码中说明
    #download a folder's files 
    import socket
    class ParseUrl():
        """docstring for ParseUrl"""
        def __init__(self, url):
            self.url = url
            self.method = ""
            self.host = ""
            self.port =""
        def get_method(self):
            method_url = self.url

            self.method = method_url.split(":")[0]

            print "Request Method:",self.method
            return self.method
        def get_host(self):
            temp_pos = self.url.find("://")
            temp_url = self.url[temp_pos+3:]
            
            self.host = temp_url[:temp_url.find(":")]

            print "Request Host:",self.host

            return self.host
        def get_port(self):

            tem_url = self.url.split(":")[2]

          
            if tem_url.find("/"):
                tem_url = tem_url[:tem_url.find("/")]

            print "Request Port:",tem_url  
            self.port = tem_url
            return self.port 
        def parse(self):
            temp_methd = self.get_method()
            temp_host = self.get_host()
            temp_port = self.get_port()
            return temp_methd,temp_host,temp_port


    def main():

        #ftp url   这一步是解析一个ftp请求 得到host和port
        request_url = "ftp://localhost:2121/"

        parse_url = ParseUrl(request_url)

        method,host,port = parse_url.parse()

        print "method,host,port",method,host,port
        

    #get connection to ftp server



        ftp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

        ftp_socket.connect((host,int(port)))

        user = "admin "
        password = "admin "

        print ftp_socket.recv(1024)

        ftp_socket.send("USER "+user)

        print ftp_socket.recv(1024)

        ftp_socket.send("PASS "+password)

        print ftp_socket.recv(1024)

        ftp_socket.send("CWD ")

        print ftp_socket.recv(1024)

        ftp_socket.send("TYPE ASCII ")

        print ftp_socket.recv(1024)
        
       

        ftp_socket.send("SIZE my.txt ")
        temp_size = ftp_socket.recv(1024)
        file_size = int(temp_size.split(" ")[1])

        print file_size

    #LIST 
        ftp_socket.send("PASV ")
        new_port = ftp_socket.recv(1024)
        print new_port
        before_port = ""
        temp_port =""

        if new_port.startswith("227"):
            temp_port = new_port.split(",")[5]
            before_port = new_port.split(",")[4]
            temp_port = temp_port.replace(") ","")
        #get the server's new port   
        new_request_port = int(before_port)*256+int(temp_port)
        # connect to the server's new port
        ftp_data_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        ftp_data_socket.connect((host,new_request_port))
        ftp_socket.send("LIST ")
        
        print ftp_data_socket.recv(1024).decode("utf-8")
        
        ftp_socket.recv(1024)


    #RETR
        ftp_socket.send("PASV ")
        new_port = ftp_socket.recv(1024)
        print new_port
        before_port = ""
        temp_port =""

        if new_port.startswith("227"):
            temp_port = new_port.split(",")[5]
            before_port = new_port.split(",")[4]
            temp_port = temp_port.replace(") ","")
        #get the server's new port   
        new_request_port = int(before_port)*256+int(temp_port)
        # connect to the server's new port
        ftp_data_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        ftp_data_socket.connect((host,new_request_port))

        ftp_socket.send("RETR my.txt ")

        file_content = ftp_data_socket.recv(file_size)
        
        print file_content

        download_file = open("my.txt","wb")
        download_file.write(file_content)
        download_file.close()
        #print  create_data_connection(ftp_socket,"LIST","",host)

    if __name__ == '__main__':
        main()


  • 相关阅读:
    【Oracle】将表名与字段名连接成一行数据展示,字段名使用顿号的分隔
    【Accountancy】资产
    【FinacialKnowledge】财务报表及名词解释
    模块独立性原理
    C# this.Invoke()的作用与用法
    浅谈C#委托和事件(转载)
    C#三种定时器的实现
    一张图看懂开源许可协议,开源许可证GPL、BSD、MIT、Mozilla、Apache和LGPL的区别
    c++ comment
    C#使用StreamWriter类写入文件文件
  • 原文地址:https://www.cnblogs.com/-Doraemon/p/4700069.html
Copyright © 2020-2023  润新知