zoukankan      html  css  js  c++  java
  • 一个初学者的辛酸路程-FTP-9

    前言

    今天,我要描述一个FTP的故事

    主要内容

    嗯,今天主要以阶梯性的形式来做一个FTP项目。

    第一步:

    我要实现这么一个功能,一个FTP客户端,1个FTP服务端,2端建立连接以后可以进行通讯。

    服务端

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    # Author: Leon xie
    
    import socket  #倒入模块
    import json
    
    s = socket.socket() #申明网络模式
    
    s.bind(('localhost',9001)) #绑定
    
    s.listen(5) #监听
    
    while True:
        conn,client_addr = s.accept()
        print("got a new conn:",client_addr)
    
        #与客户端持续交互
        while True:
            data = conn.recv(1024)
            print("recv data:",data)
            data = json.loads(data.decode())
    
            if data.get('action') is not None: #如果是合法的格式
                if data['action'] == "put":
                    #客户端发送文件到服务端
                    file_obj = open(data["filename"],'wb')
                    received_size = 0
    
                    while received_size <data["size"]:
                        recv_data = conn.recv(4096)
                        file_obj.write(recv_data)
                        received_size += len(recv_data)
                        print(data['size'],received_size)
                    else:
                        print("successfully received file [%s]",data['filename'])
                        file_obj.close()
    
                elif data['action'] == "get":
                    #客户端下载文件从服务端
                    pass

    客户端

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    # Author: Leon xie
    
    import socket
    import os
    import json
    
    client = socket.socket()
    client.connect(('localhost',9001))
    
    
    while True:
        choice = input(">>").strip()
    
        if len(choice) == 0:continue
        #解析两条不同的指令
    
        cmd_list =  choice.split()
        if cmd_list[0] == "put":
            if len(cmd_list) == 1:
                print("no filename follows after put cmd")
                continue
    
            filename = cmd_list[1] #这个就是文件名了
            if os.path.isfile(filename):
                file_obj = open(filename,'rb') #二进制格式传输,这样省去了encode
                base_filename = filename.split("/")[-1]
                #print(filename,os.path.getsize(filename))
                print(base_filename,os.path.getsize(filename))
                #print(file_obj,os.path.getsize(filename))
                #告诉对方我要发什么
                data_header = {
                    "action":"put",
                    "filename":base_filename,
                    "size":os.path.getsize(filename)
                }
                #client.send(json.dump(data_header))
                client.send(json.dumps(data_header).encode())
                #发送
                for line in file_obj:
                    client.send(line)
    
                print("----send the file done----")
    
            else:
                print("file is not valid.")
                continue
    
        if cmd_list[0] == "get":
            pass

    实现了最简单的文件传输

    客户端输出

    >>put f:/test.7z
    test.7z 351004454
    ----send the file done----
    >>

    服务端输出

    351004454 351004083
    351004454 351004104
    351004454 351004447
    351004454 351004454
    successfully received file [%s] test.7z






  • 相关阅读:
    【应试】数据通信与网络
    【应试】操作系统OS
    【笔记】 卷积
    【HDU 5920】 Ugly Problem
    【笔记】位运算
    【洛谷P1378】油滴扩展
    【洛谷 P1120】 小木棍[数据加强版]
    [codeforces]Round #538 (Div. 2) F. Please, another Queries on Array?
    [BZOJ]2563: 阿狸和桃子的游戏
    [BZOJ]4668: 冷战
  • 原文地址:https://www.cnblogs.com/jixuege-1/p/6154984.html
Copyright © 2011-2022 走看看