[Debug记录] 分布式实验-FTP编程

news/2025/11/16 16:07:03/文章来源:https://www.cnblogs.com/Capache/p/19228346

分布式课程学习JavaSocketTCP/UDP,第一次实验要求基于Java Socket TCP和UDP实现一个简易的网络文件服务程序,包含服务器端FileServer和客户端FileClient。完成实验的过程中遇到一些比较典型的bug,记录一下。

用来结束多行响应的空行没有被读走

服务端发送响应的方法是这么写的

// 发送多行响应,最后以空行结束
private void sendMultiLine(String... lines) {for (String l : lines) writer.println(l);writer.println(); // 结束空行
}

而客户端我一开始是直接按行读取,遇到空行结束:

// 读取多行直到遇到空行
while (line = tcpReader.readLine()) != null && !line.isEmpty()) {sb.append(line).append('\n');line = tcpReader.readLine();
}

但这样写有时会有空行不能被正确读走,测试时输入了下一个命令才返回上一个命令的结果,显然是不对的。

最后在前面加上循环,每次读取时先把前面的空行读完再开始读内容

while ((line = tcpReader.readLine()) != null && line.isEmpty()) {// 跳过前导空行
}// 读取多行直到遇到空行
while (line != null && !line.isEmpty()) {sb.append(line).append('\n');line = tcpReader.readLine();
}

保存文件之前没有检查目录是否存在、文件名是否合法

使用get命令下载文件时直接写了这么一句,以项目路径+get的参数来作为下载路径

Path localFile = Paths.get(fileName).toAbsolutePath().normalize();

这里的问题有两个:

文件名不一定合法

前文对命令的校验只检查了命令本身是否合法,对应的文件存不存在是服务端考虑的时,就没有再考虑过,但是文件存在不代表命令参数中的fileName是合法的文件名。文件名参数有可能形如RelativeDir/fileName,此时相当于在项目目录下创建以此为名称的文件,显然是不可以的。

我的解决方案是在下载文件之前将参数fileName改为只保留文件名的形式

fileName = fileName.substring(fileName.lastIndexOf('/') + 1); 

下载路径不一定要放在项目目录,不应该写死,并且在设置下载路径时应该检查路径是否存在,如果不存在应该及时创建

我的解决方案是在构造函数中就将文件保存目录确定下来:

// 设置本地文件保存目录
localFileDir = Paths.get(".").toAbsolutePath().normalize().resolve("downloads");
System.out.println("本地文件保存目录: " + localFileDir);
if (!Files.exists(localFileDir)) {try {Files.createDirectories(localFileDir);} catch (IOException e) {System.err.println("无法创建本地文件保存目录: " + e.getMessage());}
}

客户端监听的端口和服务器监听的端口是两码事,不能搞混

服务端中设定好了TCP和UDP端口,但客户端程序编写时只留意设定了服务端的端口。

TCP还好,毕竟是双向连接,但UDP是单向的,服务器监听端口UDP_PORT和客户端监听的UDP端口是两码事。于是我的程序里服务端早早发完了文件,而客户端还阻塞在苦苦等待服务端的第一个分片。

但本地运行服务端是UDP_PORT是被占用的,而且客户端也不需要固定的UDP端口来确保能被连接上。所以我的解决方案是在发送命令时给结尾附加一个端口参数,确保服务端可以明确需要向哪里发送文件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/967161.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年当下行业内知名的旧房翻新企业排名与推荐

摘要 旧房翻新行业在2025年迎来快速发展,受城市化进程加速和住房老龄化影响,市场需求持续增长,预计年增长率达15%以上(数据来源:中国建筑装饰协会2025年报告)。本文基于行业调研、用户口碑和专业技术评估,精选排…

2025年国内旧房翻新公司综合实力排行榜TOP10推荐

摘要 随着城市化进程加速和居民生活品质提升,2025年旧房翻新行业迎来爆发式增长,市场规模预计突破8000亿元。旧房翻新不仅解决老房安全隐患,更是提升居住舒适度和资产价值的重要途径。本文基于企业实力、技术水准、…

现今国内口碑好的旧房翻新企业排行

摘要 随着城市化进程加速和居民生活品质提升,2025年旧房翻新行业迎来爆发式增长。据统计,国内旧房翻新市场规模已突破万亿,年均增长率达18.7%。本文基于用户口碑、施工质量、服务体验等维度,综合评出现今国内十大旧…

Linux服务器编程实践60-双向管道:socketpair函数的完成与应用场景

Linux服务器编程实践60-双向管道:socketpair函数的完成与应用场景pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "…

前端从0到1实战】第3篇:拒绝插件,手写一个原生模态弹窗 (Modal)

【前端从0到1实战】第3篇:拒绝插件,手写一个原生模态弹窗 (Modal) 在现代 Web 开发中,模态弹窗(Modal)是最常见的交互组件之一。很多新手会选择直接引入第三方插件,但其实手写一个原生 Modal 是理解 HTML 结构定…

20232413 2025-2026-1 《网络与系统攻防技术》实验五实验报告

一.实验内容 1.搜索域名和ip信息 2.获取好友IP地址及其地理位置 3.使用nmap扫描靶机进行漏洞分析 4.查询个人网上信息和学习高级搜索技能 二.实验过程 2.1 DNS 域名信息查询(以baidu.com为例) 2.1.1whois 查询 DNS 注…

循环数组下一个更大元素:从错误到精通(含2种解法+同类型扩展)

循环数组下一个更大元素:从错误到精通(含2种解法+同类型扩展)在字符串、数组类算法中,“循环结构”是高频考点——尤其是“循环数组的下一个更大元素”,既考察对单调栈的理解,又要求处理“绕回开头”的特殊逻辑。…

随机化数论算法总结

好吧这个名字很蠢() 1 Miller_Rabin 作用试判断 \(10^{18}\) 级别或以上的数是否是质数,显然此时 \(O(\sqrt n)\) 的朴素算法是无法使用的。 1.1 费马小定理 当 \(p\) 为质数时,对于任意整数 \(a\),有 \(a^{p-1}\…

20232422 2025-2026-1 《网络与系统攻防技术》实验五实验报告

20232422 龙浩然 2025-2026-1 《网络与系统攻防技术》实验五实验报告一、实验内容DNS信息搜集:查询指定域名的注册信息、对应IP和地理位置。 网络抓包定位:通过Wireshark抓取qq好友IP,解析其地理位置。 靶机扫描探测…

完整教程:【数据迁移】HBase Bulkload批量加载原理

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

【AI智能体开发】什么是LLM?如何在本地搭建属于自己的Ai智能体? - 详解

【AI智能体开发】什么是LLM?如何在本地搭建属于自己的Ai智能体? - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family:…

20232422 龙浩然 2025-2026-1 《网络与系统攻防技术》实验五实验报告

20232422 龙浩然 2025-2026-1 《网络与系统攻防技术》实验五实验报告一、实验内容DNS信息搜集:查询指定域名的注册信息、对应IP和地理位置。 网络抓包定位:通过Wireshark抓取qq好友IP,解析其地理位置。 靶机扫描探测…

DL 1 深度学习简介 张量tensor操作

DL 1 深度学习简介 张量tensor操作1.深度学习简介 学习视频:https://www.bilibili.com/video/BV1c5yrBcEEX/?spm_id_from=333.337.search-card.all.click&vd_source=0a4fe9884700974ee1043a65993f87fb 1.1 概念…

Spring Cloud Alibaba + RocketMQ

RocketMQ 在微服务的世界里,服务间的消息就像快递包裹,如果没有高效可靠的传递方式,小摊位之间的信息就容易丢失或者延迟。这时候,你就需要 RocketMQ——微服务界的“快递小能手”,帮你高效、安全、准时地传递每一…

bpftrace报错:definitions.h:17:3: error: unknown type name pid_t

bpftrace报错:definitions.h:17:3: error: unknown type name pid_t使用bpftrace时报错definitions.h:15:3: error: unknown type name pid_t definitions.h:16:3: error: unknown type name pid_t definitions.h:17:…

mybatis_generator

点击查看import lombok.Data;import java.sql.*; import java.util.*;public class CodeGenerator {// 数据库连接配置private static final String DB_URL = "jdbc:mysql://localhost:3306/test";private s…

目前市场口碑好的平移门服务商

摘要 随着智能出入管理系统的快速发展,2025年平移门行业迎来新一轮技术革新。平移门作为智能安防体系的重要组成部分,其安全性、稳定性和智能化水平成为用户关注焦点。本文基于行业数据和技术评测,为您推荐目前市场…

[AGC030F]Permutation and Minimum

Description 给定一个长为 \(2n\) 的序列 \(A\),其中 \(A\) 的每一位要么是 \(-1\),要么是 \(1\sim 2n\) 的一个数。将每个 \(A_i=-1\) 替换为 \(1 \sim 2n\) 的某个数,使 \(A\) 成为一个长 \(2n\) 的排列。令长为 …

2025年安徽伸缩门公司哪家权威:十大品牌综合评测

摘要 随着智慧城市建设的加速推进,2025年伸缩门行业迎来技术升级与市场扩容的双重机遇。安徽省作为华东地区制造业重镇,聚集了众多伸缩门生产企业,其中专业技术实力与服务质量成为行业竞争的核心要素。本文基于市场…