# DiskMirror TCP服务器与客户端的使用 *开源技术栏* 本文章将详细的介绍关于 DiskMirror 库中 TCP 适配器 的作用以及其使用方法! ## 目录 [TOC]  ## 介绍 ### 服务端适配器功能 - 创建 TCP 服务: 服务端适配器负责监听指定的 IP 地址和端口,等待来自客户端的连接请求。 - 处理文件请求: 当客户端发起文件上传、下载或查询请求时,服务端适配器接收这些请求,并根据请求类型执行相应的文件操作。 - 封装其他适配器: 服务端适配器本身并不直接进行文件系统的读写操作;相反,它将接收到的请求转发给内部封装的另一个适配器(例如本地文件系统适配器),这个适配器会实际执行文件的读写任务。 - 响应客户端: 一旦封装的适配器完成请求的操作,服务端适配器将结果返回给客户端。 ### 客户端适配器功能 - 建立连接: 客户端适配器负责与服务端建立 TCP 连接。 - 发送请求: 客户端可以通过适配器向服务端发送各种类型的文件操作请求,如上传文件、下载文件或查询文件信息。 - 接收响应: 客户端适配器从服务端接收操作的结果,并可能对这些结果进行进一步处理或展示给用户。 ### 使用场景 - 第三方文件存储服务器对接: 可直接使用库文件,书写简单的代码,不再需要从底层实现,大大减少了开发周期。 - 跨网络文件访问: 用户可以从不同的地理位置访问存储在远端服务器上的文件。 - 备份与恢复: 实现定期备份到远程存储,或者从远程存储恢复数据。 - 协作工作: 多个用户可以通过网络共享同一份文件,实现团队合作。 ### 和HTTP服务器有什么区别 DiskMirror TCP 适配器 提供了一种通过TCP/IP协议进行文件上传、下载和查询的服务。它允许创建一个持续的连接,支持自定义通信协议,并且可以实现双向的数据传输,适用于需要高效和灵活控制的应用场景。然而,它可能需要更多的开发工作来处理底层细节,并且在穿越防火墙和网络代理时可能会遇到兼容性问题。 HTTP 则是一种广泛使用的高层协议,易于使用且得到了几乎所有编程语言和平台的支持。它具有良好的缓存机制和RESTful架构,非常适合构建Web服务。但是,HTTP是无状态的,每次请求都需要额外的头部信息,这可能增加小数据传输的开销,并且频繁建立连接会导致一定的延迟。 总的来说,选择TCP适配器还是HTTP取决于具体需求:如果追求高性能和定制化,TCP可能是更好的选择;如果需要快速开发和广泛的兼容性,那么HTTP则更加合适。 本文章我们介绍的是 DiskMirror 中的 TCP 适配器,如果您期望查询到 http 服务器相关的资料,您可以前往[《diskMirror-backEnd spring-boot & docker》](https://www.lingyuzhao.top/?/linkController=/articleController&link=-31975978)查看!其中介绍了 http 服务器的部署以及使用方法! ## 代码书写 ### 服务器端代码 ```java 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 字符串,其就是查询到的文件系统信息,目前代表没有任何文件和目录。 ```json {"userId":1,"type":"Binary","useSize":0,"useAgreement":true,"maxSize":134217728,"urls":[],"res":"ok!!!!"} ``` 于此同时,服务端结束运行了,因为 run 函数的工作结束了,如果您期望服务端不会停止,您可以尝试使用循环调用 run 函数的方式,或使用线程池等功能~ ------ ***操作记录*** 作者:[LY小助手](https://www.lingyuzhao.top//index.html?search=18 "LY小助手") 操作时间:2024-10-05 15:48:23 星期六 【时区:UTC 8】 事件描述备注:保存/发布 中国 天津 [](如果不需要此记录可以手动删除,每次保存都会自动的追加记录)