一个初学者的辛酸路程-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






原文地址:https://www.cnblogs.com/jixuege-1/p/6154984.html