当前位置: 首页 > news >正文

文件传输工具FTransferor<优化篇>

在上一篇文章中,我们详细探讨了FTransferor文件传输工具的设计与实现,并展示了它在局域网文件传输方面的高效性。然而,随着互联网应用场景的不断丰富,传统的基于 TCP/UDP 的传输方式已经无法满足部分开发者的需求。特别是在跨平台、跨网络传输场景中,对 HTTP 协议的支持变得尤为重要。因此,本篇文章将围绕 FTransferor 的优化改造,为其增加 HTTP 协议支持,并提升其在复杂网络环境下的适用性。

为什么要支持 HTTP 协议?

HTTP 是一种通用性极强的传输协议,具备以下特点:

1)广泛的兼容性:几乎所有平台都支持 HTTP 协议,可以无缝集成到现有的系统中。

2)易用性:基于 HTTP 的文件传输可以通过浏览器直接访问,无需额外安装客户端工具。

通过为 FTransferor 增加 HTTP 协议支持,我们可以大幅提升工具的实用性,使其不仅适用于局域网场景,还能满足跨网络的传输需求。

功能上的补充

在上一篇中我们对文件传输工具的功能仅支持上传文件,在增加HTTP协议支持的同时,还对下载、查看文件列表等功能进行了丰富,并且利用密码支持了一定程度的安全性。

具体实现

增加HTTP Server并实现一个简单的拦截器

首先是HTTP Server,这个实现相对简单,主要就是文件下载和文件列表查看两个HTTP处理器。

const (PathList      = "/files"PathDownload  = "/download/"QueryParamKey = "secret"
)func runHttpServer(port int) {fn := "runHttpServer"http.HandleFunc(PathList, secretFilterHandler(fileListHandler))http.HandleFunc(PathDownload, secretFilterHandler(fileDownloadHandler))fmt.Printf("%s is listening on port %d\n", fn, port)if err := http.ListenAndServe(fmt.Sprintf(":%d", port), nil); err != nil {fmt.Println("Error starting file server:", err)}
}

拦截器实现,主要就是拦截query参数中的secret key,需要和启动HTTP Server时输入的参数一致。

func secretFilterHandler(next http.HandlerFunc) func(w http.ResponseWriter, r *http.Request) {return func(w http.ResponseWriter, r *http.Request) {getSecret := r.URL.Query().Get(QueryParamKey)if getSecret != secret {http.Error(w, "Unauthorized", http.StatusUnauthorized)return}next(w, r)}
}

运行以上代码后,用户可以通过浏览器和客户端命令中查看和下载当前目录中的文件,客户端的实现请继续往下看。

HTTP Server端具体实现

首先是文件列表查看功能的实现:

func fileListHandler(w http.ResponseWriter, r *http.Request) {files, err := os.ReadDir(path)if err != nil {http.Error(w, "Unable to list files", http.StatusInternalServerError)return}result := make([]string, 0)w.Header().Set("Content-Type", "application/json")for _, f := range files {if !f.IsDir() {result = append(result, f.Name())}}marshal, err := json.Marshal(map[string]interface{}{"data": result,})if err != nil {http.Error(w, "Unable to list files", http.StatusInternalServerError)return}_, _ = w.Write(marshal)
}

其次是文件下载功能的实现:

func fileDownloadHandler(w http.ResponseWriter, r *http.Request) {fileName := strings.TrimPrefix(r.URL.Path, PathDownload)filePath := filepath.Join(path, fileName)if _, err := os.Stat(filePath); os.IsNotExist(err) {http.Error(w, "File not found", http.StatusNotFound)return}http.ServeFile(w, r, filePath)
}
客户端实现

客户端我们可以直接使用浏览器进行操作,但是考虑到在Linux服务器的情况下可能只有终端命令行,因此也提供命令的方式进行操作,主要的思路就是增加命令参数,根据参数去访问服务端不同的HTTP接口。

代码实现:

func httpClient(action Action, f string) {httpServerAddr := fmt.Sprintf("%s%s", Scheme, server)client := http.Client{}switch action {case ActionGet:url := fmt.Sprintf("%s%s%s?%s=%s", httpServerAddr, PathDownload, f, QueryParamKey, passwd)resp, err := client.Get(url)if err != nil {fmt.Println("Error downloading file:", err)}defer func() {_ = resp.Body.Close()}()// 创建文件以保存下载的内容file, err := os.Create(f)if err != nil {fmt.Println("Error creating file:", err)return}defer func() {_ = file.Close()}()// 将响应的内容写入文件if _, err = io.Copy(file, resp.Body); err != nil {fmt.Println("Error writing to file:", err)return}fmt.Println("File downloaded successfully!")case ActionList:url := fmt.Sprintf("%s%s?%s=%s", httpServerAddr, PathList, QueryParamKey, passwd)resp, err := client.Get(url)if err != nil {fmt.Println("Error downloading file:", err)}defer func() {_ = resp.Body.Close()}()// 读取响应的bodybody, err := io.ReadAll(resp.Body)if err != nil {fmt.Println("Error reading response body:", err)return}// 将body转换为mapvar data map[string]interface{}if err = json.Unmarshal(body, &data); err != nil {fmt.Println("Error unmarshaling JSON:", err)return}// 打印mapfmt.Println("Data as map:", data)default:}
}
新功能演示

首先启动服务端,TCP和HTTP共同启动,但是注意不能使用同一个端口号:

./FTransferor server --path filepath --port 8081 --webport 8082 --secret D&J$HE23

然后使用客户端命令,查看文件列表:

./FTransferor.exe cli --server localhost:8082 --action list --passwd D&J$HE23

下载文件:

./FTransferor.exe cli --server localhost:8082 --action get --passwd D&J$HE23 --file t.zip
总结

通过本次优化,我们为 FTransferor 增加了对 HTTP 协议的支持,显著提升了其在不同网络环境下的适用性。未来,我们计划进一步优化工具的交互体验,例如通过 Web 界面实现更加友好的操作方式。

相关文章:

文件传输工具FTransferor<优化篇>

在上一篇文章中,我们详细探讨了FTransferor文件传输工具的设计与实现,并展示了它在局域网文件传输方面的高效性。然而,随着互联网应用场景的不断丰富,传统的基于 TCP/UDP 的传输方式已经无法满足部分开发者的需求。特别是在跨平台…...

【最新】17个一站式数据集成平台案例PPT下载(Apache SeaTunnel )

17个Apache SeaTunnel案例下载见附件! 开发篇 1.Apache SeaTunnel——OLAP 引擎的数据动脉 1.1项目定位——EtLT 时代的新一代数据集成平台 1.2Apache SeaTunnel 核心功能 1.3Apache SeaTunnel 在 OLAP 场景下的应用 1.4WhaleTunnel 产品特性 2.教你从头到尾开发一…...

【每日学点鸿蒙知识】子窗口方向、RichEdit不居中、本地资源缓存给web、Json转对象丢失方法、监听状态变量数组中内容改变

1、HarmonyOS 应用新建子窗口设置显示方向未生效? 子窗口getPreferredOrientation获取到的是横向 设置没问题,但是ui显示还是纵向的 直接设置主窗口的方向即可。参考demo: import window from ohos.window;Entry Component struct Index {…...

【AI绘画】Midjourney前置指令/imagine与单图指令详解

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: AI绘画 | Midjourney 文章目录 💯Midjourney前置指令/imagine什么是前置指令?/imaginepromptUpscale(图像分离)Variations(变化)🔄&a…...

【鸿蒙NEXT】鸿蒙里面类似iOS的Keychain——关键资产(@ohos.security.asset)实现设备唯一标识

前言 在iOS开发中Keychain 是一个非常安全的存储系统,用于保存敏感信息,如密码、证书、密钥等。与 NSUserDefaults 或文件系统不同,Keychain 提供了更高的安全性,因为它对数据进行了加密,并且只有经过授权的应用程序才…...

学习笔记 --C#基础其他知识点(数据结构)

C#中的数据结构《二》–视频学习笔记 在数据结构的分类: 1.集合 2.线性 3.树形 4.图状结构 数据结构是数据在程序中的存储结构,和基本的数据操作 算法:解决问题的解决思路,基于数据结构 本课程包括:线性表&#xff…...

AI与药学 | ChatGPT 在临床药学中的有效性以及人工智能在药物治疗管理中的作用

《Effectiveness of ChatGPT in clinical pharmacy and the role of artificial intelligence in medication therapy management》这篇文献研究了ChatGPT在临床药学,特别是在药物治疗管理(MTM)中的有效性。 一、研究背景 (Background) MTM …...

Streamlining QA with Automated Testing for 3D Models

Quality assurance testing in 3D modeling is like walking a tightrope. Balancing the need for detailed accuracy and the time it takes to achieve it is no small feat. But what if we could make the tightrope wider, the task less daunting? And it’s where aut…...

产品原型设计

🤣🤣目录🤣🤣 一、Axure原型设计(Axure RP 9 )1.1 软件下载安装1.2 产品原型展示1.3 产品原型下载1.4 视频课程推荐 二、磨刀原型设计2.1 软件下载安装2.2 产品原型展示2.3 产品原型下载2.4 视频课程推荐 什…...

【Linux命令】su、sudo、sudo su、sudo -i、sudo -l的用法和区别

su 命令 su (Switch User 切换用户),允许用户切换到另一个用户的身份,默认情况下是切换到 root 用户。 默认行为:如果只运行 su,则系统会要求输入 root 用户的密码来切换到 root 用户,获取管理员权限。 切换到其他用…...

【广州计算机学会、广州互联网协会联合主办 | ACM独立出版 | 高录用】第四届大数据、信息与计算机网络国际学术会议(BDICN 2025)

第四届大数据、信息与计算机网络国际学术会议(BDICN 2025)定于2025年01月10-12日在中国广州举行。会议旨在为从事“大数据”、“计算机网络”与“信息”研究的专家学者、工程技术人员、技术研发人员提供一个共享科研成果和前沿技术,了解学术发…...

HTML5 开关(Toggle Switch)详细讲解

HTML5 开关(Toggle Switch)详细讲解 1. 任务概述 开关(Toggle Switch)是一种用于表示二元状态(如开/关)的用户界面控件。用户可以通过点击开关来切换状态,常见于设置选项、开关功能等场景。 2…...

win32汇编环境下,双击窗口程序内生成的listview列表控件的某行,并提取其内容的示例程序

;运行效果 ;双击后 ;上源码,仔细研究里面的几条备注就理解原理了 ;提取窗口程序内生成的listview列表控件的内容示例程序 ;抄下面源码,可以在radasm里面直接编译运行。主要的部分加了备注。 ;>>>>>>>>>>>>>>…...

mysql主从断开后问题排查及修复

服务器mysql主从同步断开后,进行主从恢复 问题:mysql的主从断开了,在从服务器上通过以下命令查看状态,发现Slave_SQL_Running为No SHOW SLAVE STATUS\G;Slave_IO_Running:表示从服务器读取主服务器日志的线程 Slave_…...

[2025] 如何在 Windows 计算机上轻松越狱 IOS 设备

笔记 1. 首次启动越狱工具时,会提示您安装驱动程序。单击“是”确认安装,然后再次运行越狱工具。 2. 对于Apple 6s-7P和iPad系列(iOS14.4及以上),您应该点击“Optinos”并勾选“允许未经测试的iOS/iPadOS/tvOS版本”&…...

计算机网络—————考研复试

第一章、计算机网络体系结构 1. OSI参考模型和TCP/IP模型: OSI与TCP/IP的记忆方法:只需把OSI的七层记住,将应用层、表示层、会话层一起记,到TCP/IP变成应用层。物理层和数据链路层换成网络接口层。把网络层换个字变成网际层。 而…...

[pdf、epub]260道《软件方法》强化自测题业务建模需求分析共216页(202412更新)

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 260道《软件方法》强化自测题业务建模需求分析共216页(202412更新) 已上传到本CSDN账号的资源 如果下载不到,也可以访问以下链接: ht…...

LeetCode - 初级算法 数组(只出现一次的数字)

只出现一次的数字 这篇文章讨论如何找到一个数组中只出现一次的数字,确保算法的时间复杂度为线性,且只使用常量额外空间。 免责声明:本文来源于个人知识与公开资料,仅用于学术交流。 描述 给定一个非空整数数组 nums,除了某个元素只出现一次以外,其余每个元素均出现两…...

Android性能优化概述

应用启动速度慢页面加载慢交互卡顿CrashANR 针对这些问题,可以逐一进行优化 1.启动优化 Android应用启动分为冷启动和热启动以及初次安装启动,此处只分析冷启动及热启动 冷启动:当设备无该应用进程时,用户操作拉起应用&#xff…...

C++ 实现map容器从大到小排序

map容器默认从小到大排序 利用仿函数可以修改map容器的排序规则为从大到小 示例&#xff1a; #include<iostream> #include<string> #include<map> using namespace std; class MyCompare { public: bool operator()(const int v1, const int v2) co…...

魔兽争霸3 Windows 11兼容性终极解决方案:让你的经典游戏重获新生

魔兽争霸3 Windows 11兼容性终极解决方案&#xff1a;让你的经典游戏重获新生 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽争霸3在Windo…...

实战应用:基于快马平台构建企业级msi安装解决方案,涵盖检测、安装与配置

实战应用&#xff1a;基于快马平台构建企业级msi安装解决方案 最近在帮公司优化软件发布流程时&#xff0c;遇到了一个典型问题&#xff1a;如何确保我们的软件产品能够稳定、可靠地部署到客户环境中。特别是当涉及到复杂的依赖项检查和系统配置时&#xff0c;手动安装不仅效率…...

AI时代的价值冲击——共识瓦解与转型阵痛

AI时代的价值冲击——共识瓦解与转型阵痛当我们将价值理解为“社会对效用增量的局部共识”时&#xff0c;人工智能对劳动力市场的冲击便呈现出全新的面貌。这场冲击的本质&#xff0c;并非简单的“机器替代人”&#xff0c;而是旧有的、基于工业时代劳动形态的价值共识体系正在…...

避开这些坑!安卓13 Launcher3修改搜索框位置的血泪经验

安卓13 Launcher3搜索框位置修改实战&#xff1a;从源码解析到避坑指南 1. 理解Launcher3的核心架构 在安卓系统中&#xff0c;Launcher3作为默认的启动器应用&#xff0c;承担着用户与设备交互的核心界面功能。要修改其搜索框位置&#xff0c;首先需要深入理解其架构设计。 La…...

Pads Layout 高效工作流——库管理优化与文件转换实战

1. 库管理优化&#xff1a;从混乱到高效的关键步骤 刚开始用Pads Layout那会儿&#xff0c;我最头疼的就是库文件管理。每次打开不同版本的设计文件&#xff0c;总会出现各种封装丢失、属性错乱的问题。后来才发现&#xff0c;库管理就像整理衣柜——分类清晰才能快速找到需要的…...

别再乱插了!从USB鼠标到固态硬盘,一文搞懂电脑USB接口的‘家族树’

别再乱插了&#xff01;从USB鼠标到固态硬盘&#xff0c;一文搞懂电脑USB接口的‘家族树’ 每次给电脑插USB设备时&#xff0c;你是否遇到过这些糟心事&#xff1f;新买的移动硬盘插上去毫无反应&#xff0c;键盘鼠标突然集体失灵&#xff0c;或者插满四个接口后打印机开始间歇…...

开源可二次开发的物联网云平台,支持工业设备远程控制与数据采集

物联网云平台工业设备对接远程控制数据采集视频接入开源可二次开发 该物联网云平台使用 Java 语言、主流技术组合开发&#xff0c;支持多数据源&#xff0c;支持代码一键生成&#xff0c;方便快速开发。 1、内含物联网云平台全套源码&#xff08;源码全部开放&#xff0c;无任何…...

从Simulink仿真到Altium Designer画板:一个直流电机调速系统的完整诞生记

从算法仿真到电路实现&#xff1a;直流电机双闭环调速系统全流程实战 在实验室里调试电机控制系统时&#xff0c;最令人兴奋的时刻莫过于看到仿真曲线和实际示波器波形完美吻合的瞬间。作为电子工程师&#xff0c;我们每天都在与这种"虚实结合"的挑战打交道——如何在…...

如何通过YimMenu提升GTA5游戏体验与安全防护:从入门到精通

如何通过YimMenu提升GTA5游戏体验与安全防护&#xff1a;从入门到精通 【免费下载链接】YimMenu YimMenu, a GTA V menu protecting against a wide ranges of the public crashes and improving the overall experience. 项目地址: https://gitcode.com/GitHub_Trending/yi/…...

快速原型设计:基于快马平台构建openclaw专业卸载工具的全流程交互demo

今天想和大家分享一个特别实用的开发经验——如何用InsCode(快马)平台快速搭建专业软件卸载工具的原型。最近正好在研究openclaw这款专业软件的卸载流程&#xff0c;发现市面上很多卸载工具都太简单粗暴&#xff0c;于是决定自己动手做个更完善的方案。 原型设计思路 专业软件的…...