当前位置: 首页 > article >正文

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

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

开源技术栏

本文章将详细的介绍关于 DiskMirror 库中 TCP 适配器 的作用以及其使用方法!

目录

文章目录

  • DiskMirror TCP服务器与客户端的使用
    • 目录
      • 服务端适配器功能
      • 客户端适配器功能
      • 使用场景
      • 和HTTP服务器有什么区别
    • 代码书写
      • 服务器端代码
      • 客户端代码
    • 运行测试
      • 启动服务端代码
      • 启动客户端代码

在这里插入图片描述

服务端适配器功能

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


http://www.kler.cn/a/370553.html

相关文章:

  • 如何设置HTTPS站点防御?
  • MongoDB 学习指南:深入探索非关系型数据库
  • 联发科MTK6762/MT6762安卓核心板_4G智能模块应用
  • 迅为RK3576开发板Android 多屏显示
  • git命令
  • 将图像输入批次扁平化为CNN
  • poi处理excel文档时,与lombok的@Accessors(chain = true)注解冲突
  • 10.24.2024刷华为OD C题型(四) -- 对象list按照多个属性排序
  • Python xlrd库介绍
  • 双十一宠物空气净化器应该怎么选?自用适合养宠物家庭的空气净化器推荐
  • python数据处理常用操作
  • ArrayList简单的洗牌算法
  • C++Socket通讯样例(服务端)
  • Vue 权限管理
  • STM32 第3章 如何用串口下载程序
  • 快消品行业数字化转型:定制开发 S2B2C 商城小程序的主战场选择与突破
  • windows环境下,使用docker搭建redis集群
  • .NET Core WebApi第5讲:接口传参实现、数据获取流程、204状态码问题
  • Flutter之build 方法详解
  • 第15课 算法(上)
  • 海外学子如何玩转反向代购,解锁财富密码!
  • 数据库的开发---实训报告
  • React Intl 的工作原理
  • Knife4j配置 ▎使用 ▎教程 ▎实例
  • Peach-9B-8k-Roleplay模型部署指南
  • 利用Kubernetes原生特性实现简单的灰度发布和蓝绿发布