1、 课程设计目的
本课程设计旨在实现一个基于 TCP 协议 的文件传输系统,模拟实际网络传输过程,并结合多种文件存储方案,完成文件接收与保存的后端处理。通过该系统,学生能深入理解:
基于 Socket 的 TCP 通信原理;
文件传输协议的设计与实现;
网络编程中数据流的处理方式;
结合 Spring Boot 完成服务模块封装;
将传输后的文件按需保存至本地或云存储系统。
使用git进行代码的版本管理和代码托管
项目的github地址:https://github.com/mengnankkkk/tcp-file-transfer
2、课程设计要求
实现 TCP Server,持续监听客户端连接,接收文件数据流;
设计传输协议,确保文件名、大小、内容等完整接收;
实现服务端文件保存功能,支持多种存储后端(本地 / 腾讯云 / 阿里云 / MinIO);
文件传输完成后记录文件元信息(文件名、时间);
提供文件列表接口(/files)供前端查看已上传文件;
使用 Java + Spring Boot 构建后端服务,模块清晰,便于扩展;
3、相关知识
Socket 编程:Java 中 ...
基础语法数据类型java中有8种基本类型:
byte, short, int, long, float, double, boolean, char
还有引用类型
类、数组、接口等。
比如String就是引用类型。引用类型的默认是 null
类型
位数
默认值
包装类
byte
8
0
Byte
short
16
0
Short
int
32
0
Integer
long
64
0L
Long
float
32
0.0f
Float
double
64
0.0d
Double
char
16
‘\u0000’
Character
boolean
1
false
Boolean
浮点数的默认类型是double 赋给 float 需加 f 后缀。精度变小
byte是循环的,满了128就从-128开始
double和long都是默认占64位的存储空间
long用于存储整数值,范围为-2^63^到 2^63^-1,double用于存储浮点数,遵循IEEE 754标准。
基本数据类型和引用类型的主要区别在于:
基本类型变量存储的是实际的数据值 ...
基础面试题目概念1.说一下Java的特点平台无关性:Java的编写一次,运无不在”哲学是其最大的特点之一。Java编译器将源代码编译成字节码(bytecode),该字节码可以在任何安装了Java虚拟机(JVM)的系统上运行。面向对象:JaVa是一严格的面可对象编程语言,几乎一切都是对象。面可对象编程(OOP)特性使得代码更易于维护和重用,包括类(class)、对象(object)、继承(inheritance)、多态 (polymorphism)、抽象(abstraction)和封装(encapsulation)。内存管理:JaVa有目己的垃圾回收机制,目动管理内存和回收不再使用的对象。这样,开发者不需要手动管埋内存,从而减少内存泄漏和其他内存相关的问题。
2.Java 的优势和劣势是什么?首先,Java的优势,我记得跨平台应该是一个大点,因为JVM的存在,一次编写到处运行。然后面向对象,这个可能也是优势,不过现在很多语言都支持面向对象,但是Java的设计从一开始就是OOP的。还有强大的生态系统,比如Spring框架,Hibernate,各种库和工具,社区支持大,企业应用广泛。另外,内 ...
技术栈
未读基础1.详细的说说Redis的数据类型redis中常用的五种数据结构:string、list、set、zset、hash。
String结构底层是一个简单动态字符串,支持扩容,存储字符串。所以可应用于微信文章的阅读数或点赞,缓存对象、常规计数、分布式锁、共享 session 信息等。
list存储线性有序且可重复的元素,底层数据结构可以是双向链表/压缩列表。微薄的粉丝列表或好友列表,消息队列(但是有两个问题:1. 生产者需要自行实现全局唯一 ID;2. 不能以消费组形式消费数据)等。
set存储不可重复的元素,一般用于求交集、差集等,底层数据结构可以是hash和整数数组,所以可应用于抽奖,通过sadd添加不同的用户,srandom key number选出中将用户。还有集合的运算:sdiff、sintern与sunio就是集合的差交并运算,所以可应用于QQ的共同好友 聚合计算(并集、交集、差集)场景,比如点赞、共同关注、抽奖活动等。
zset存储的是有序不可重复的元素,zset为每个元素添加了一个score属性作为排序依据,底层数据结构可以是ziplist和跳表,所以可应用于排行榜,类 ...
java
未读相向双指针两个指针 left=0, right=n−1,从数组的两端开始,向中间移动,这叫相向双指针。上面的滑动窗口相当于同向双指针。
344. 反转字符串编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
1234567891011class Solution344{ public void reverseString(char[] s){ int n = s.length; for (int left=0,right=n-1;left<right;left++,right--){ char tmp = s[left]; s[left] = s[right]; s[right] = tmp; } }}
简单的双指针解决
就是让头和尾互换值就ok了
125. 验证回文串如果 ...
前置知识JUC是java.util.concurrent包的简称,在Java5.0添加,目的就是为了更好的支持高并发任务。让开发者进行多线程编程时减少竞争条件和死锁的问题!
进程:一个运行中的程序的集合; 一个进程往往可以包含多个线程,至少包含一个线程
Java默认有几个线程? 两个 main线程 gc线程
线程:线程(thread)是操作系统能够进行运算调度的最小单位。
并发(多线程操作同一个资源,交替执行)CPU一核, 模拟出来多条线程,天下武功,唯快不破,快速交替并行(多个人一起行走, 同时进行)CPU多核,多个线程同时进行 ; 使用线程池操作
线程实现主要分为三类:用户级线程(ULT)、内核级线程(KLT)和混合型线程实现。
线程实现主要分为三类:用户级线程(ULT)、内核级线程(KLT)和混合型线程实现。轻量级进程(LWP)不是线程的实现方式,而是操作系统内核用来支持线程运行的一种机制。
分析三种线程实现方式:
\1. 用户级线程(ULT):- 线程的创建、调度和管理都由用户程序完成- 操作系统对线程一无所知- 优点是切换开销小,缺点是无法利用多处理器
\2. 内核级线程(K ...
滑动窗口看到一串数组,要求数量的时候,可能就会用到滑动窗口
定长只需要考虑进出即可
然后考虑窗口大小不足的时候,continue
模板:
123456789101112131415class Solution643{ public double findMaxAverage(int[] nums, int k){ int maxS = Integer.MIN_VALUE; int s= 0; for (int i =0;i<nums.length;i++){ s +=nums[i]; if (i<k-1){ continue; } maxS = Math.max(maxS,s); s -=nums[i-k+1]; } return (double) maxS/k; }}
头进 ...
简介Spring是一个支持快速开发Java EE应用程序的框架。它提供了一系列底层容器和基础设施,并可以和大量常用的开源框架无缝集成,可以说是开发Java EE应用程序的必备。
Spring Framework主要包括几个模块:
支持IoC和AOP的容器;
支持JDBC和ORM的数据访问模块;
支持声明式事务的模块;
支持基于Servlet的MVC开发;
支持基于Reactive的Web开发;
以及集成JMS、JavaMail、JMX、缓存等其他模块。
Ioc容器在学习Spring框架时,我们遇到的第一个也是最核心的概念就是容器。
什么是容器?容器是一种为某种特定组件的运行提供必要支持的一个软件环境。例如,Tomcat就是一个Servlet容器,它可以为Servlet的运行提供运行环境。类似Docker这样的软件也是一个容器,它提供了必要的Linux环境以便运行一个特定的Linux进程。
通常来说,使用容器运行组件,除了提供一个组件运行环境之外,容器还提供了许多底层服务。例如,Servlet容器底层实现了TCP连接,解析HTTP协议等非常复杂的服务,如果没有容器来提供这些服务,我们 ...
事务1.spring 事务失效的场景有哪些?Spring Boot通过Spring框架的事务管理模块来支持事务操作。事务管理在Spring Boot中通常是通过 @Transactional 注解来实现的。事务可能会失效的一些常见情况包括:
未捕获异常: 如果一个事务方法中发生了未捕获的异常,并且异常未被处理或传播到事务边界之外,那么事务会失效,所有的数据库操作会回滚。
非受检异常: 默认情况下,Spring对非受检异常(RuntimeException或其子类)进行回滚处理,这意味着当事务方法中抛出这些异常时,事务会回滚。
事务传播属性设置不当: 如果在多个事务之间存在事务嵌套,且事务传播属性配置不正确,可能导致事务失效。特别是在方法内部调用有 @Transactional 注解的方法时要特别注意。
多数据源的事务管理: 如果在使用多数据源时,事务管理没有正确配置或者存在多个 @Transactional 注解时,可能会导致事务失效。
跨方法调用事务问题: 如果一个事务方法内部调用另一个方法,而这个被调用的方法没有 @Transactional 注解,这种情况下外层事务可能会失效,调 ...
English
未读5.1No work is insignificant. All labor that uplifts humanity has dignity and importance and should be undertaken with painstaking excellence.
cheque 支票
cherish 珍爱
chimney 烟囱
choke 窒息
cholesterol 胆固醇
5.2The beautiful thing about learning is nobody can take it away from you.
Christian 基督徒
circuit 巡回
chilly 寒冷的
5.3Today’s mighty oak is just yesterday’s nut, that held its ground.
clap 鼓掌
clarity 清楚的
ceremonial 礼仪的
clause 子句
claw 爪子
clerical 牧师的
cliff 悬崖
cereal 谷物
5.4Young people have changed t ...
java
未读定长型定长型:
直接考虑头和尾就行。
只需要考虑移除(离开窗口)的字母 a 是不是元音,以及添加(进入窗口)的字母 i 是不是元音即可
然后考虑窗口大小不足的时候,continue
1456. 定长子串中元音的最大数目给你字符串 s 和整数 k 。
请返回字符串 s 中长度为 k 的单个子字符串中可能包含的最大元音字母数。
英文中的 元音字母 为(a, e, i, o, u)。
解决定长窗口的问题:
只需要考虑移除(离开窗口)的字母 a 是不是元音,以及添加(进入窗口)的字母 i 是不是元音即可
1234567891011121314151617181920212223class Solution1456{ public int maxVowels(String S,int k ){ char[] s = S.toCharArray(); int ans = 0; int vowel = 0; for (int i =0;i<s.length;i++){ if ( ...
总体架构架构思想:分层:
Controller → Service → Entity,这三层架构体系,
Controller 层 不直接操作数据库,而是通过 subjectService 去拿数据。
业务逻辑集中在 Service 层,Controller 只负责接收请求、调用服务、返回结果。
统一的返回结果:
不直接返回裸的 List 或 对象,而是包一层 RestResponse。
成功返回 RestResponse.ok(数据)。
统一格式,前端处理简单。
后期可以很方便统一加异常码、消息、分页信息。
合理的使用对象映射:
Subject 是实体类(Entity),对应数据库。
SubjectVM、SubjectEditRequestVM 是视图模型(VM),对应前端页面。
通过 modelMapper.map(d, SubjectVM.class) 进行转换,不暴露数据库结构。进行反序列化,更加安全
使用流式编程:
123456List<SubjectVM> subjectVMS = subjects.stream().map(d -> { S ...