Bootstrap

DiskMirror TCP服务器与客户端的使用

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文本!
 中国 天津

;