DiskMirror TCP服务器与客户端的使用
开源技术栏
本文章将详细的介绍关于 DiskMirror 库中 TCP 适配器 的作用以及其使用方法!
目录
服务端适配器功能
-
创建 TCP 服务: 服务端适配器负责监听指定的 IP 地址和端口,等待来自客户端的连接请求。
-
处理文件请求: 当客户端发起文件上传、下载或查询请求时,服务端适配器接收这些请求,并根据请求类型执行相应的文件操作。
-
封装其他适配器: 服务端适配器本身并不直接进行文件系统的读写操作;相反,它将接收到的请求转发给内部封装的另一个适配器(例如本地文件系统适配器),这个适配器会实际执行文件的读写任务。
-
响应客户端: 一旦封装的适配器完成请求的操作,服务端适配器将结果返回给客户端。
客户端适配器功能
-
建立连接: 客户端适配器负责与服务端建立 TCP 连接。
-
发送请求: 客户端可以通过适配器向服务端发送各种类型的文件操作请求,如上传文件、下载文件或查询文件信息。
-
接收响应: 客户端适配器从服务端接收操作的结果,并可能对这些结果进行进一步处理或展示给用户。
使用场景
-
第三方文件存储服务器对接: 可直接使用库文件,书写简单的代码,不再需要从底层实现,大大减少了开发周期。
-
跨网络文件访问: 用户可以从不同的地理位置访问存储在远端服务器上的文件。
-
备份与恢复: 实现定期备份到远程存储,或者从远程存储恢复数据。
-
协作工作: 多个用户可以通过网络共享同一份文件,实现团队合作。
和HTTP服务器有什么区别
DiskMirror TCP 适配器 提供了一种通过TCP/IP协议进行文件上传、下载和查询的服务。它允许创建一个持续的连接,支持自定义通信协议,并且可以实现双向的数据传输,适用于需要高效和灵活控制的应用场景。然而,它可能需要更多的开发工作来处理底层细节,并且在穿越防火墙和网络代理时可能会遇到兼容性问题。
HTTP 则是一种广泛使用的高层协议,易于使用且得到了几乎所有编程语言和平台的支持。它具有良好的缓存机制和RESTful架构,非常适合构建Web服务。但是,HTTP是无状态的,每次请求都需要额外的头部信息,这可能增加小数据传输的开销,并且频繁建立连接会导致一定的延迟。
总的来说,选择TCP适配器还是HTTP取决于具体需求:如果追求高性能和定制化,TCP可能是更好的选择;如果需要快速开发和广泛的兼容性,那么HTTP则更加合适。
本文章我们介绍的是 DiskMirror 中的 TCP 适配器,如果您期望查询到 http 服务器相关的资料,您可以前往《diskMirror-backEnd spring-boot & docker》查看!其中介绍了 http 服务器的部署以及使用方法!
代码书写
服务器端代码
package org.example;
import top.lingyuzhao.diskMirror.conf.DiskMirrorConfig;
import top.lingyuzhao.diskMirror.core.AdapterPacking;
import top.lingyuzhao.diskMirror.core.DiskMirror;
import top.lingyuzhao.diskMirror.core.TcpAdapter;
import java.io.IOException;
// 当前代码文件是服务器端版本!
@DiskMirrorConfig(
// 这里设置的两个端口为服务端必须的,第一个代表的就是发送文件元数据和请求的端口 第二个就是发送文件本身的端口
fsDefaultFS = "8080,8081"
)
public class Main {
public static void main(String[] args) throws IOException {
// 使用 Main 类对象中的配置注解构建一个 TCP 适配器
final AdapterPacking adapter = DiskMirror.TCP_Adapter.getAdapterPacking(
// 本地文件系统适配器 TCP适配器接收到请求之后,会将请求转发给此处设置的适配器对象处理
DiskMirror.LocalFSAdapter,
// TCP 适配器的配置类 其指定的就是端口相关的配置
Main.class,
// TCP 适配器的子适配器配置类,其在这里就是我们刚刚设置的 DiskMirror.LocalFSAdapter
// 因此这里是 DiskMirror.LocalFSAdapter 的配置类
SubConfig.class
);
// 直接启动 这里会阻塞,每次 run的调用 都只会接收一个请求
((TcpAdapter) adapter).run();
}
// TCP 适配器主要任务就是接收 TCP请求并转发,实际的处理任务是交给子适配器的
// 因此我们需要再准备一个配置类给子适配器
@DiskMirrorConfig()
public static class SubConfig {
}
}
客户端代码
package org.example;
import com.alibaba.fastjson2.JSONObject;
import top.lingyuzhao.diskMirror.conf.DiskMirrorConfig;
import top.lingyuzhao.diskMirror.core.*;
import java.io.IOException;
// 当前代码文件是客户端版本!
@DiskMirrorConfig(
fsDefaultFS = "127.0.0.1:8080,8081"
)
public class Main2 {
public static void main(String[] args) throws IOException {
// 根据配置注解类 Main2 ,构造一个 TCP 客户端适配器
final Adapter adapter = DiskMirror.TCP_CLIENT_Adapter.getAdapter(Main2.class);
// 直接使用 TCP 客户端适配器访问 TCP 服务器中的 1 号空间文件系统 首先需要构建请求对象
final DiskMirrorRequest urls = DiskMirrorRequest.getUrls(1, Type.Binary);
// 开始发送请求并接收结果
final JSONObject urls1 = adapter.getUrls(urls);
System.out.println(urls1);
}
}
运行测试
启动服务端代码
这个时候 服务端代码的控制台不会有任何的输出,但是也没有停止运行,这是因为其被 run 函数阻塞了,在等待客户端的请求!
启动客户端代码
客户端代码立刻返回了下面的 json 字符串,其就是查询到的文件系统信息,目前代表没有任何文件和目录。
{"userId":1,"type":"Binary","useSize":0,"useAgreement":true,"maxSize":134217728,"urls":[],"res":"ok!!!!"}
于此同时,服务端结束运行了,因为 run 函数的工作结束了,如果您期望服务端不会停止,您可以尝试使用循环调用 run 函数的方式,或使用线程池等功能~
操作记录
作者:LY小助手
操作时间:2024-10-05 15:48:23 星期六 【时区:UTC 8】
事件描述备注:保存/发布
中国 天津
操作记录
操作人员:LY小助手
操作时间:2024-10-26 12:34:09 星期六
事件描述备注:复制了源文章对应的markdown
文本!
中国 天津