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 協議 - 消息加密模式html
SocketD 是一種二進制的點對點通訊協議,是一種新的網絡通訊第七層協議。旨在用於分佈式應用程序中。從這個意義上講,SocketD能夠是RSocket等其餘相似協議的替代方案。它的消息協議規範具備異步,背壓的雙向,多路複用,斷線重連,基於消息等特性。暫時只提供Java實現,目前作爲Solon rpc的sockte通道協議。java
本案以簡單的消息加密模式爲例演示:(在消息上報模式的基礎上,增長加密演示)git
<dependency> <groupId>org.noear</groupId> <artifactId>solon.boot.socketd.smartsocket</artifactId> <version>1.2.18</version> </dependency>
//啓動服務端 public class ServerApp { public static void main(String[] args) { //啓動Solon容器(SocketD bean&plugin 由solon容器管理) Solon.start(ServerApp.class, args, app -> { app.enableSocketD(true); //設置增強協議,使用加密協議(客戶端也要一同設置) SocketD.setProtocol(new MessageProtocolSecret() { @Override public byte[] encrypt(byte[] bytes) throws Exception { return EncryptUtils.aesEncrypt(bytes,"pLft36Ok5zfmP6zI"); } @Override public byte[] decrypt(byte[] bytes) throws Exception { return EncryptUtils.aesDecrypt(bytes,"pLft36Ok5zfmP6zI"); } }); }); } } //定義服務端監聽 @ServerEndpoint public class ServerListener implements Listener { @Override public void onOpen(Session session) { System.out.println("有客戶端鏈上來嘍..."); } @Override public void onMessage(Session session, Message message) { //收到消息,作業務處理 if(message.flag() != MessageFlag.heartbeat){ System.out.println("服務端:我收到心跳"); }else { 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, app->{ //設置增強協議,使用加密協議(服務端也要一同設置) SocketD.setProtocol(new MessageProtocolSecret() { @Override public byte[] encrypt(byte[] bytes) throws Exception { return EncryptUtils.aesEncrypt(bytes,"pLft36Ok5zfmP6zI"); } @Override public byte[] decrypt(byte[] bytes) throws Exception { return EncryptUtils.aesDecrypt(bytes,"pLft36Ok5zfmP6zI"); } }); }); //建立會話(若是後端是WebSocekt,協議頭爲:ws) Session session = SocketD.createSession("tcp://localhost:28080"); //設定30秒自動上發心跳(若是斷開了,也嘗試自動重鏈) session.sendHeartbeatAuto(30); //上報消息 session.send("Helloworld server!"); } }
https://gitee.com/noear/solon_demo/tree/master/demo28.solon_socketd_message後端