中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

tio-core-spring-boot-starter如何整合tio到springboot項目

發布時間:2021-09-28 10:02:50 來源:億速云 閱讀:356 作者:柒染 欄目:大數據

今天就跟大家聊聊有關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);
	}
}

啟動客戶端端,查看終端輸出。

服務端輸出

tio-core-spring-boot-starter如何整合tio到springboot項目

原生回調接口支持

跟 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";
	}
}

客戶端輸出截圖

tio-core-spring-boot-starter如何整合tio到springboot項目

SSL 支持

# 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

tio-core-spring-boot-starter 源碼地址

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項目有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

株洲市| 彭山县| 禄丰县| 盐城市| 新野县| 濮阳县| 公主岭市| 肇东市| 禄劝| 九寨沟县| 无棣县| 社会| 益阳市| 怀柔区| 漠河县| 红原县| 泾川县| 旌德县| 永宁县| 阜南县| 连平县| 永兴县| 海南省| 会理县| 雷州市| 丽江市| 通城县| 济宁市| 海兴县| 凤山市| 周至县| 新宁县| 三明市| 黄大仙区| 麟游县| 惠水县| 五华县| 安吉县| 容城县| 嘉黎县| 进贤县|