tio学习

package org.example;

import org.tio.core.intf.Packet;

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;

    public byte[] getBody() {
        return body;
    }

    public void setBody(byte[] body) {
        this.body = body;
    }
}

    <dependencies>
        <dependency>
            <groupId>org.t-io</groupId>
            <artifactId>tio-core</artifactId>
            <version>3.7.5.v20211028-RELEASE</version>
        </dependency>
    </dependencies>
package org.example;

import org.tio.core.ChannelContext;
import org.tio.core.TioConfig;
import org.tio.core.intf.Packet;
import org.tio.server.intf.ServerAioHandler;
import org.tio.core.exception.AioDecodeException;

import java.nio.ByteBuffer;
import java.util.Arrays;

public class HelloServerAioHandler implements ServerAioHandler {
    @Override
    public HelloPacket decode(ByteBuffer buffer, int limit, int position, int readableLength, ChannelContext channelContext) throws AioDecodeException {

        byte[] dst = new byte[readableLength];

        HelloPacket imPacket = new HelloPacket();

        buffer.get(dst);

        imPacket.setBody(dst);

        return imPacket;
    }

    /**
     * 编码:把业务消息包编码为可以发送的ByteBuffer
     * 总的消息结构:消息头 + 消息体
     * 消息头结构:    4个字节,存储消息体的长度
     * 消息体结构:   对象的json串的byte[]
     */
    @Override
    public ByteBuffer encode(Packet packet, TioConfig tioConfig, ChannelContext channelContext) {
        HelloPacket helloPacket = (HelloPacket) packet;
        byte[] body = helloPacket.getBody();
        int bodyLen = 0;
        if (body != null) {
            bodyLen = body.length;
        }
        //bytebuffer的总长度是 = 消息头的长度 + 消息体的长度
        int allLen = HelloPacket.HEADER_LENGTH + bodyLen;
        //创建一个新的bytebuffer
        ByteBuffer buffer = ByteBuffer.allocate(allLen);
        //设置字节序
        buffer.order(tioConfig.getByteOrder());
        //写入消息头----消息头的内容就是消息体的长度
        buffer.putInt(bodyLen);
        //写入消息体
        if (body != null) {
            buffer.put(body);
        }
        return buffer;
    }

    /**
     * 处理消息
     */
    @Override
    public void handler(Packet packet, ChannelContext channelContext) throws Exception {
        HelloPacket helloPacket = (HelloPacket) packet;
        byte[] body = helloPacket.getBody();
        System.out.println("收到消息");
        if (body != null) {
            String str = new String(body, HelloPacket.CHARSET);
            System.out.println("收到消息来自客户端:" + channelContext.getId() + "的消息:" + str);
        }
    }
}


package com.example.tio.tio;

import org.tio.server.ServerTioConfig;
import org.tio.server.TioServer;
import org.tio.server.intf.ServerAioHandler;
import org.tio.server.intf.ServerAioListener;

import java.io.IOException;

public class Starter {

    public static ServerAioHandler aioHandler = new MyServerHandler();

    public static ServerAioListener aioListener = new MyServerListener();

    public static ServerTioConfig serverTioConfig = new ServerTioConfig("hello-server", aioHandler, aioListener);

    public static TioServer tioServer = null;

    public static String serverIp = null;

    public static int serverPort = 3100;

    public static void run() throws IOException {
        serverTioConfig.setHeartbeatTimeout(90000);
        tioServer = new TioServer(serverTioConfig);
        tioServer.start(serverIp, serverPort);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值