您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關tio-core-spring-boot-starter如何整合tio到springboot項目,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
首先,你需要在 pom.xml 中引入 tio-core-spring-boot-starter
構件
<dependency> <groupId>org.t-io</groupId> <artifactId>tio-core-spring-boot-starter</artifactId> <!--此版本號跟著tio主版本號一致即可--> <version>3.3.5.v20190712-RELEASE</version> </dependency>
一、給SpringBoot Application 主類添加 @EnableTioServerServer
注解
@SpringBootApplication @EnableTioServerServer public class TioServerApplication { public static void main(String[] args) { SpringApplication.run(TioServerApplication.class, args); } }
二、接下來,修改配置文件
tio: core: server: # websocket port default 9876 port: 6789 # 心跳時間 heartbeat-timeout: 60000 # 集群配置 默認關閉 cluster: enabled: false # 集群是通過redis的Pub/Sub實現,所以需要配置Redis redis: ip: 127.0.0.1 port: 6379 all: true group: true ip: true user: true # SSL 配置 ssl: enabled: false key-store: password: trust-store:
三、編寫消息處理類
/** * 消息處理 handler, 通過加 {@link TioServerMsgHandler} 注解啟用,否則不會啟用 * 注意: handler 是必須要啟用的,否則啟動會拋出 {@link TioMsgHandlerNotFoundException} 異常 * * @author yangjian */ @TioServerMsgHandler public class HelloServerMsgHandler implements ServerAioHandler { /** * 解碼:把接收到的ByteBuffer,解碼成應用可以識別的業務消息包 * 總的消息結構:消息頭 + 消息體 * 消息頭結構: 4個字節,存儲消息體的長度 * 消息體結構: 對象的json串的byte[] */ @Override public HelloPacket decode(ByteBuffer buffer, int limit, int position, int readableLength, ChannelContext channelContext) throws AioDecodeException { return PacketUtil.decode(buffer, limit, position, readableLength, channelContext); } /** * 編碼:把業務消息包編碼為可以發送的ByteBuffer * 總的消息結構:消息頭 + 消息體 * 消息頭結構: 4個字節,存儲消息體的長度 * 消息體結構: 對象的json串的byte[] */ @Override public ByteBuffer encode(Packet packet, GroupContext groupContext, ChannelContext channelContext) { return PacketUtil.encode(packet, groupContext, channelContext); } /** * 處理消息 */ @Override public void handler(Packet packet, ChannelContext channelContext) throws Exception { HelloPacket helloPacket = (HelloPacket) packet; byte[] body = helloPacket.getBody(); if (body != null) { String str = new String(body, HelloPacket.CHARSET); System.out.println("收到消息:" + str); HelloPacket resppacket = new HelloPacket(); resppacket.setBody(("收到了你的消息,你的消息是:" + str).getBytes(HelloPacket.CHARSET)); Tio.send(channelContext, resppacket); } return; } }
四、實現消息實體包
/** * 消息包實體 * * @author yangjian */ public class HelloPacket extends Packet { private static final long serialVersionUID = -172060606924066412L; public static final int HEADER_LENGTH = 4;//消息頭的長度 public static final String CHARSET = "utf-8"; private byte[] body; /** * @return the body */ public byte[] getBody() { return body; } /** * @param body the body to set */ public void setBody(byte[] body) { this.body = body; } }
接下來啟動服務端
客戶端采用 Tio 的常規程序啟動,只有三個文件,啟動非常簡單。
一、編寫常量類
public interface Const { /** * 服務器地址 */ public static final String SERVER = "127.0.0.1"; /** * 監聽端口 */ public static final int PORT = 6789; /** * 心跳超時時間 */ public static final int TIMEOUT = 5000; }
二、消息處理類
public class HelloClientAioHandler implements ClientAioHandler { private static HelloPacket heartbeatPacket = new HelloPacket(); /** * 解碼:把接收到的ByteBuffer,解碼成應用可以識別的業務消息包 * 總的消息結構:消息頭 + 消息體 * 消息頭結構: 4個字節,存儲消息體的長度 * 消息體結構: 對象的json串的byte[] */ @Override public HelloPacket decode(ByteBuffer buffer, int limit, int position, int readableLength, ChannelContext channelContext) throws AioDecodeException { return PacketUtil.decode(buffer, limit, position, readableLength, channelContext); } /** * 編碼:把業務消息包編碼為可以發送的ByteBuffer * 總的消息結構:消息頭 + 消息體 * 消息頭結構: 4個字節,存儲消息體的長度 * 消息體結構: 對象的json串的byte[] */ @Override public ByteBuffer encode(Packet packet, GroupContext groupContext, ChannelContext channelContext) { return PacketUtil.encode(packet, groupContext, channelContext); } /** * 處理消息 */ @Override public void handler(Packet packet, ChannelContext channelContext) throws Exception { HelloPacket helloPacket = (HelloPacket) packet; byte[] body = helloPacket.getBody(); if (body != null) { String str = new String(body, HelloPacket.CHARSET); System.out.println("收到消息:" + str); } return; } /** * 此方法如果返回null,框架層面則不會發心跳;如果返回非null,框架層面會定時發本方法返回的消息包 */ @Override public HelloPacket heartbeatPacket(ChannelContext channelContext) { return heartbeatPacket; }
三、客戶端啟動類
public class HelloClientStarter { //服務器節點 public static Node serverNode = new Node(Const.SERVER, Const.PORT); //handler, 包括編碼、解碼、消息處理 public static ClientAioHandler tioClientHandler = new HelloClientAioHandler(); //事件監聽器,可以為null,但建議自己實現該接口,可以參考showcase了解些接口 public static ClientAioListener aioListener = null; //斷鏈后自動連接的,不想自動連接請設為null private static ReconnConf reconnConf = new ReconnConf(5000L); //一組連接共用的上下文對象 public static ClientGroupContext clientGroupContext = new ClientGroupContext(tioClientHandler, aioListener, reconnConf); public static TioClient tioClient = null; public static ClientChannelContext clientChannelContext = null; /** * 啟動程序入口 */ public static void main(String[] args) throws Exception { clientGroupContext.setHeartbeatTimeout(Const.TIMEOUT); tioClient = new TioClient(clientGroupContext); clientChannelContext = tioClient.connect(serverNode); //連上后,發條消息玩玩 send(); } private static void send() throws Exception { HelloPacket packet = new HelloPacket(); packet.setBody("hello world".getBytes(HelloPacket.CHARSET)); Tio.send(clientChannelContext, packet); } }
啟動客戶端端,查看終端輸出。
服務端輸出
跟 handler 一樣,其他原生回調接口的使用方法保持不變,只需要在對應的實現類上加上對應的注解就 OK 了。
//最主要的邏輯處理類,必須要寫,否則拋異常 public class HelloServerMsgHandler implements ServerAioHandler {} //可不寫,通過加 @TioServerAioListener 注解啟用,否則不會啟用 public class HelloServerAioListener implements ServerAioListener {} //可不寫, 通過加 @TioServerGroupListener 注解啟用,否則不會啟用 public class HelloServerGroupListener implements GroupListener{} //可不寫,通過加 @link TioServerIpStatListener 注解啟用,否則不會啟用 public class HelloServerIpStatListener implements IpStatListener {}
這里注意:每個對應的回調接口都需要通過添加注解手動啟用,否則默認不啟用,不會自動掃描
這個也非常簡單,只需獲取到 TioServerBootstrap
,其他都變得非常簡單。
@RestController public class HelloController { static Logger logger = LoggerFactory.getLogger(HelloController.class); @Autowired private TioServerBootstrap bootstrap; @GetMapping("/") public String index() { return "Hello, tio-spring-boot-starter !!!"; } /** * 推送消息到客戶端 * @throws Exception */ @GetMapping("/push") public String pushMessage() throws Exception { HelloPacket packet = new HelloPacket(); packet.setBody("This message is pushed by Tio Server.".getBytes(HelloPacket.CHARSET)); Tio.sendToAll(bootstrap.getServerGroupContext(), packet); logger.info("Push a message to client successfully"); return "Push a message to client successfully"; } }
客戶端輸出截圖
# SSL 配置 ssl: enabled: true key-store: key-store path password: password trust-store: trust-store path
# 集群配置 默認關閉 cluster: enabled: false # 集群是通過redis的Pub/Sub實現,所以需要配置Redis redis: ip: 127.0.0.1 port: 6379 all: true group: true ip: true user: true
https://github.com/tywo45/t-io/tree/master/src/zoo/spring-boot/tio-core/src/main/java/org/tio/core/starter
看完上述內容,你們對tio-core-spring-boot-starter如何整合tio到springboot項目有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。