自定义FTP协议、Python代码实现

目录

一:代码

二:运行方式


一:代码

server.py  服务端

import json
import socket
import struct

sk = socket.socket()  # 实例化socket
sk.bind(('10.76.31.75', 8080))  # 绑定ip与port
sk.listen()  # 监听

conn, addr = sk.accept()  # 等待接受链接
print('from client ', addr)  # 打印客户端的ip与port
head_struct = conn.recv(4)  # 接受4字节、确定要传输的文件大小
# if not head_struct: break
head_len = struct.unpack('i', head_struct)[0]  # 解码、得到报文头部的长度
head_json = conn.recv(head_len).decode('utf-8')  # 接受报文头部并解码
head_dic = json.loads(head_json)  # 将字节码转换为json
print(head_dic)  # 打印出报文头
recv_size = 0
file_name = head_dic['filename']
filesize = head_dic['filesize']
cmd = head_dic['operate']
if cmd == 'upload':  # 判断是否为上传操作
    # conn.send(b'received!')  # 若为上传、回复received!消息
    with open(file_name, 'wb') as f:  # 键接受到的数据写入文件
        while True:
            if recv_size < filesize:  # 如果filesize 不等于0
                recv_data = conn.recv(1024)
                f.write(recv_data)
                recv_size += len(recv_data)
                print('recvsize:%s filesize:%s' % (recv_size, filesize))
            else:
                recv_data = conn.recv(1024)
                f.write(recv_data)
                break

elif cmd == 'download':
    print("下载请求..............")
else:
    print('非法操作.........')

conn.close()
sk.close()

client.py 客户端

import os
import json
import struct
import socket

sk = socket.socket()  # 创建socket类
sk.connect(('10.76.31.75', 8080))  # 绑定ip与端口

def get_filename(file_path):
    filename = os.path.basename(file_path)
    return filename

# 选择 操作
operate = ['upload', 'download']  # 上传或下载
for num,opt in enumerate(operate, 1):
    print(num,opt)

num = int(input('请输入您要做的操作序号 : '))
if num == 1:
    '''上传操作'''
    file_path = input('请输入要上传的文件路径 : ')
    # 告诉对方要上传的文件的名字
    file_name = get_filename(file_path)
    filesize = os.path.getsize(file_path)  # 文件的字节大小
    head_dic = {'operate': 'upload', 'filename': file_name, 'filesize': filesize}
    print(head_dic)
    head_json = json.dumps(head_dic)  # jsom转字符串
    head_json_bytes = bytes(head_json, encoding='utf-8')  # 字符串转字节
    head_struct = struct.pack('i', len(head_json_bytes))  # 报文头长度编码为4字节长度
    sk.send(head_struct)  # 发送报文头头部长度
    sk.send(head_json_bytes)  # 发送报文头内容(字节)
    send_size = 0  # 初始化已发送字节大小
    with open(file_path, 'rb') as f:  # 用于读取文件
        content = f.read()
        sk.send(content)

elif num == 2:
    '''下载操作'''
    print("暂不支持下载操作")
sk.close()
# 文本文件  D:\my_upload\my_file.txt
# 视频文件  D:\my_upload\Wildlife.wmv

二:运行方式

1、启动server.py服务端程序

2、启动客户端

 

3、按照提示键入命令 

注:要输入自己电脑上、指向向传输的文件绝对路径、我输入的是我电脑上的一个视频文件。

4、文件夹传输成功

 说明;

1、本例是用环回口在一台机器上传输的。可以修改ip和port实现两台机器出阿叔文件。

2、文件下载与上传实现方法类似、未实现。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值