zoukankan      html  css  js  c++  java
  • 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()


  • 相关阅读:
    UVA120Stacks of Flapjacks
    [.NET] 基于windows mobile 5.0 开发环境配置说明
    C#实现UDP打洞
    webBrowser对跳转后的页面的处理
    Windows Mobile程序环境配置以及Windows Mobile与PC进行UDP通信总结
    C#【Fox即时通讯核心】 开发记录之三(知识储备:TCP UDP打洞)
    jqplot统计图工具简单例子
    订单编号
    windows mobile 5.0 PocketPC模拟器上网的设置 【正确】
    今明2年主要目标20112012
  • 原文地址:https://www.cnblogs.com/-Doraemon/p/4700069.html
Copyright © 2011-2022 走看看