基于 Springboot 的通过 Websocket 进行信息转发的项目

  • 1 系统介绍
  • 1.1 系统组成
  • 1.2 系统示意图
  • 1.3 已集成本系统的项目
  • 2 技术说明
  • 2.1 系统项目介绍
  • 2.2 使用场景
  • 3 系统运行
  • 3.1 客户端
  • 3.2 服务端
  • 4 系统配置
  • 4.1 服务端配置
  • 4.2 客户端配置
  • 4.3 反向代理配置
  • 5 示例 API 说明
  • 5.1 发送信息
  • 6 TODO
  • 6.1 连接加密验证
  • 6.2 双向信息传输


项目地址:Orainge/websocket-forward

1 系统介绍

本系统为基于 Websocket 的信息转发工具,在客户端没有公网IP的情况下,打通客户端与服务端的连接通道,实现双向的信息传输。

下载源码后,可以集成到其它项目中。

目前系统已实现:

  • 服务端对客户端的管理
  • 服务端发送信息到客户端

1.1 系统组成

该系统包含以下两个部分:

  • 服务端:管理客户端,接收客户端的连接,向各个客户端分发消息。
  • 客户端:连接服务端,接收来自服务端的信息。

1.2 系统示意图

spring服务转发 springboot转发_websocket

1.3 已集成本系统的项目

2 技术说明

2.1 系统项目介绍

该系统由Maven进行管理,包含 3 个 model:

  • websocket-forward-client:客户端
  • websocket-forward-server:服务端
  • websocket-forward-utils:项目工具包

其中,客户端和服务端依赖 websocket-forward-utils,因此如果运行项目时提示找不到相应类时,需要手动安装依赖到本地 Maven 仓库。

cd /path/to/project # 进入项目目录
cd websocket-forward-utils # 进入工具包目录

# 以下安装方式二选一
# 安装到本地 Maven 仓库(同时安装源码)
mvn source:jar install 
# 安装到本地 Maven 仓库(不安装源码)
mvn install

2.2 使用场景

  • 客户端没有公网IP,但是需要被动接收信息。
  • 客户端需要实时接收来自服务端发送的消息,且对消息传递时效性要求比较高。
  • 不使用轮询的方式进行查询。

3 系统运行

3.1 客户端

客户端打包完成后会生成 .jar 包,该 .jar 包可直接运行。

java -jar websocket-forward-client.jar

3.2 服务端

服务端打包完成后会生成 .jar 包,该 .jar 包可直接运行。

java -jar websocket-forward-server.jar

4 系统配置

4.1 服务端配置

# 服务端配置
websocket-server:
  response:
    time-out: 20000 # 服务端等待客户端回复报文的时间(单位:毫秒)

# 允许的客户端列表
# 只有在列表里的客户端才可以连接
websocket-client:
  list:
    - id: TEST_CLIENT_ID # 客户端 ID
      key: TEST_CLIENT_KEY # 客户端密钥
      description: "客户端描述" # 客户端描述
      # 是否由服务器定时发送 ping-pong 信息进行保活 (默认不开启)
      # keep-alive: true

4.2 客户端配置

# 服务端配置
websocket-server:
  # 服务器 URL (http->ws; https->wss)
  url: ws://localhost:8080/exchange
  # 连接服务端失败后等待多少秒后重试 (默认 5 秒)
  reconnect-wait: 5

# 客户端配置
websocket-client:
  id: TEST_CLIENT_ID # 客户端ID
  security-key: TEST_CLIENT_KEY # 客户端密钥

4.3 反向代理配置

如有需要,可以为转发端或接收端配置反向代理。

以下以 Nginx 配置为例:

# Websocket 端点转发
location /exchange {
  proxy_pass  http://127.0.0.1:8080; # 转发端或接收端的 URL
  proxy_redirect off;
  proxy_set_header  Host $host:$server_port;
  proxy_set_header  X-Real-IP  $remote_addr;
  proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
  add_header X-Frame-Options "SAMEORIGIN";
}

# 发送消息服务
location /send {
  proxy_pass  http://127.0.0.1:8080; # 转发端或接收端的 URL
  proxy_redirect off;
  proxy_set_header  Host $host:$server_port;
  proxy_set_header  X-Real-IP  $remote_addr;
  proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
  add_header X-Frame-Options "SAMEORIGIN";
}

5 示例 API 说明

5.1 发送信息

GET /send/{客户端ID}
请求参数:
- text: 要发送给客户端的文本
- requireReply: 是否有要求客户端收到消息后回复。"true"-是 "false"-否

6 TODO

6.1 连接加密验证

WebsocketClientUtil.verifyClient()

目前,客户端加入验证只验证服务端和客户端配置的key字符串是否一致,后续可以引进一次性密码(HOTP)等验证方式

6.2 双向信息传输

目前系统只实现了服务端到客户端的单向信息传输,实际上基于 Websocket 的特性,客户端也可以向服务端发送信息,通过服因此可以将客户端改造,实现服务端和客户端的双向信息传输;此外,通过服务端中转,客户端也可以向另一个客户端发送消息,因此也可以改造成为自定义的客户端消息互通平台。