Solon rpc 之 SocketD 协议 - 消息鉴权模式
Solon rpc 之 SocketD 协议系列
Solon rpc 之 SocketD 协议 - 概述
Solon rpc 之 SocketD 协议 - 消息上报模式
Solon rpc 之 SocketD 协议 - 消息应答模式
Solon rpc 之 SocketD 协议 - 消息订阅模式
Solon rpc 之 SocketD 协议 - RPC调用模式
Solon rpc 之 SocketD 协议 - 单链接双向RPC模式
Solon rpc 之 SocketD 协议 - 消息加密模式
SocketD 是一种二进制的点对点通信协议,是一种新的网络通信第七层协议。旨在用于分布式应用程序中。从这个意义上讲,SocketD可以是RSocket等其他类似协议的替代方案。它的消息协议规范具有异步,背压的双向,多路复用,断线重连,基于消息等特性。暂时只提供Java实现,目前做为Solon rpc的sockte通道协议。
本案在消息上报模式的基础上增加签权为例演示:
服务端
//启动服务端
public class ServerApp {
public static void main(String[] args) {
//启动Solon容器(SocketD bean&plugin 由solon容器管理)
Solon.start(ServerApp.class, args, app -> app.enableSocketD(true));
}
}
//定义服务端监听
@ServerEndpoint
public class ServerListener implements Listener {
@Override
public void onOpen(Session session) {
System.out.println("有客户端链上来喽...");
}
@Override
public void onMessage(Session session, Message message) throws IOException {
if (session.getHandshaked() == false) {
//消息是线程池分发的,确保鉴权时的消息顺序锁一下
synchronized (session) {
onMessage0(session, message);
}
} else {
onMessage0(session, message);
}
}
private void onMessage0(Session session, Message message) throws IOException {
//如果是握手,则做鉴权处理
if (message.flag() == MessageFlag.handshake) {
if (Utils.isEmpty(message.header())) {
session.close();
} else {
Map<String, String> headers = HeaderUtil.decodeHeaderMap(message.header());
if ("1".equals(headers.get("token"))) {
//如果token是1,则设为成功握手
System.out.println("签权成功");
session.setHandshaked(true);
} else {
session.close();
}
}
return;
}
//没有握手成功之前,不能做别的事;且自动断开链接
if (session.getHandshaked() == false) {
System.out.println("这个客户端很坏,没签权就想发包:(");
session.close();
}
//如果是心跳,则乎略
if (message.flag() == MessageFlag.heartbeat) {
System.out.println("服务端:我收到心跳");
return;
}
//业务处理
System.out.println("服务端:我收到:" + message.bodyAsString());
}
}
客户端
//启动客户端
public class ClientApp {
public static void main(String[] args) throws Throwable {
//启动Solon容器(SocketD bean&plugin 由solon容器管理)
Solon.start(ClientApp.class, args);
//创建会话(如果后端是WebSocekt,协议头为:ws)
Session session = SocketD.createSession("tcp://localhost:28080");
//发送业务握手(进行签权)
session.sendHandshake(Message.wrapHandshake("sn=1&token=1"));
//设定30秒自动上发心跳(如果断开了,也尝试自动重链)
session.sendHeartbeatAuto(30);
//上报消息
session.send("Helloworld server!");
}
}
附:示例源码
- 消息上报模式签权源码:https://gitee.com/noear/solon_socketd_demo/tree/main/demo01.send.auth
- 消息订阅模式签权源码:https://gitee.com/noear/solon_socketd_demo/tree/main/demo03.subscribe.auth
- RPC调用模式签权源码:https://gitee.com/noear/solon_socketd_demo/tree/main/demo04.rpc.auth
Solon rpc 之 SocketD 协议 - 消息鉴权模式的更多相关文章
- Solon rpc 之 SocketD 协议 - 消息上报模式
Solon rpc 之 SocketD 协议系列 Solon rpc 之 SocketD 协议 - 概述 Solon rpc 之 SocketD 协议 - 消息上报模式 Solon rpc 之 Soc ...
- Solon rpc 之 SocketD 协议 - 消息应答模式
Solon rpc 之 SocketD 协议系列 Solon rpc 之 SocketD 协议 - 概述 Solon rpc 之 SocketD 协议 - 消息上报模式 Solon rpc 之 Soc ...
- Solon rpc 之 SocketD 协议 - 消息订阅模式
Solon rpc 之 SocketD 协议系列 Solon rpc 之 SocketD 协议 - 概述 Solon rpc 之 SocketD 协议 - 消息上报模式 Solon rpc 之 Soc ...
- Solon rpc 之 SocketD 协议 - 消息加密模式
Solon rpc 之 SocketD 协议系列 Solon rpc 之 SocketD 协议 - 概述 Solon rpc 之 SocketD 协议 - 消息上报模式 Solon rpc 之 Soc ...
- Solon rpc 之 SocketD 协议 - RPC鉴权模式
Solon rpc 之 SocketD 协议系列 Solon rpc 之 SocketD 协议 - 概述 Solon rpc 之 SocketD 协议 - 消息上报模式 Solon rpc 之 Soc ...
- Solon rpc 之 SocketD 协议 - RPC调用模式
Solon rpc 之 SocketD 协议系列 Solon rpc 之 SocketD 协议 - 概述 Solon rpc 之 SocketD 协议 - 消息上报模式 Solon rpc 之 Soc ...
- Solon rpc 之 SocketD 协议 - 单链接双向RPC模式
Solon rpc 之 SocketD 协议系列 Solon rpc 之 SocketD 协议 - 概述 Solon rpc 之 SocketD 协议 - 消息上报模式 Solon rpc 之 Soc ...
- Solon rpc 之 SocketD 协议
1. 简介 SocketD 是一种二进制的点对点通信协议,是一种新的网络通信第七层协议.旨在用于分布式应用程序中.从这个意义上讲,SocketD可以是RSocket等其他类似协议的替代方案.它的消息协 ...
- springboot oauth 鉴权之——password鉴权相当于jwt鉴权模式
近期一直在研究鉴权方面的各种案例,这几天有空,写一波总结及经验. 第一步:什么是 OAuth鉴权 OAuth2是工业标准的授权协议.OAuth2取代了在2006创建的原始OAuthTM协议所做的工作. ...
随机推荐
- 剑指offer二刷——数组专题——数字在升序数组中出现的次数
题目描述 统计一个数字在升序数组中出现的次数. 我的想法 完整的解法我只想到了遍历数组然后依次统计,但这是不聪明的解法,而且没有利用上"升序数组"的这个条件. 题目标签有提醒可以用 ...
- git 远端版本回退
情景:本地更改推送远端后,想要回退到自己推送之前的某个版本. 比如想回退的分支为 test 分支. 风险:远端回退到某一版本后,之后的所有推送都没了(对应的日志记录也没了).如果是团队开发,不仅自己推 ...
- SpringBoot 拦截器和自定义注解判断请求是否合法
应用场景举例: 当不同身份的用户请求一个接口时,用来校验用户某些身份,这样可以对单个字段数据进行精确权限控制,具体看代码注释 自定义注解 /** * 对比请求的用户身份是否符合 * @author l ...
- 精尽Spring MVC源码分析 - 文章导读
该系列文档是本人在学习 Spring MVC 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释 Spring MVC 源码分析 GitHub 地址 进行阅读 Spring 版本:5.2. ...
- 05-flask基础补充
flask数据获取 request.args - 请求参数 request.form - 请求参数 request.files - 请求文件 request.cookies - 请求cookies r ...
- day112:MoFang:种植园使用websocket代替http&服务端基于flask-socketio提供服务&服务端响应信息&种植园页面显示初始化
目录 1.种植园使用websocket代替http 2.服务端基于socket提供服务 3.服务端响应信息 4.种植园页面展示 1.种植园使用websocket代替http 我们需要完成的种植园,是一 ...
- dropload.min.js 下拉刷新后,无法上拉加载更多
使用方法 1.引入文件 <script src="/app/media/js/dropload.min.js"></script> 111111111111 ...
- DRF终极封装ViewSet和Router附教程PDF源码
在DRF官方教程的学习过程中,一个很明显的感受是框架在不断地进行封装,我们自己写框架/工具/脚本/平台也可以模仿模仿,先完成底层代码,再做多层封装,让使用者很容易就上手操作.本文是教程的最后一篇,介绍 ...
- 详解Python Google Protocol Buffer
为什么要使用PB? PB(Protocol Buffer)是 Google 开发的用于结构化数据交换格式,作为腾讯云日志服务标准写入格式.因此用于写入日志数据前,需要将日志原始数据序列化为 PB 数据 ...
- MGRE实验--内网为OSPF
实验要求: R2为ISP,只能配置IP地址 R1.R3.R4之间构建MGRE环境,仅R1IP地址固定 内网使用OSPF获取路由,全网可达 拓扑: 1.配置IP地址 2.配置缺省 3.配置MGRE环境 ...