t-io文档_如何区别服务端与客户端

t-io文档_如何区别服务端与客户端<dependency><groupId>org.t-io</groupId><artifactId>tio-core</artifactId><version>3.7.4.v20210808-RELEASE</version></dependency>总共五个类。数据模型Packet、客户端处理器、客户端监听器.

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

<dependency>
            <groupId>org.t-io</groupId>
            <artifactId>tio-core</artifactId>
            <version>3.7.4.v20210808-RELEASE</version>
        </dependency>

总共五个类。数据模型Packet、客户端处理器、客户端监听器、服务端处理器、服务端监听器。

  • 数据模型
package com.example.mindsa.client;


import lombok.Getter;
import lombok.Setter;
import org.tio.core.intf.Packet;
@Setter
@Getter
public class MindPackage 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;
}
  • 客户端处理器
    package com.example.mindsa.client;
    
    import org.tio.client.intf.ClientAioHandler;
    import org.tio.core.ChannelContext;
    import org.tio.core.TioConfig;
    import org.tio.core.exception.TioDecodeException;
    import org.tio.core.intf.Packet;
    
    import java.nio.ByteBuffer;
    
    public class ClientAioHandlerImpl implements ClientAioHandler {
        /**
         * 创建心跳包
         *
         * @param channelContext
         * @return
         * @author tanyaowu
         */
        @Override
        public Packet heartbeatPacket(ChannelContext channelContext) {
            return new MindPackage();
        }
    
        /**
         * 根据ByteBuffer解码成业务需要的Packet对象.
         * 如果收到的数据不全,导致解码失败,请返回null,在下次消息来时框架层会自动续上前面的收到的数据
         *
         * @param buffer         参与本次希望解码的ByteBuffer
         * @param limit          ByteBuffer的limit
         * @param position       ByteBuffer的position,不一定是0哦
         * @param readableLength ByteBuffer参与本次解码的有效数据(= limit - position)
         * @param channelContext
         * @return
         * @throws TioDecodeException
         */
        @Override
        public Packet decode(ByteBuffer buffer, int limit, int position, int readableLength, ChannelContext channelContext) throws TioDecodeException {
            //至少要有表示数据大小的四个字节。否则会因为无法知道数据大小而无法解包。
            if (readableLength < MindPackage.HEADER_LENGTH) {
                return null;
            }
            //获取存放在头部的四个字节,即数据字节的长度。这里要与服务器的编码约定一致:即头部4byte存放数据长度。
            int bodyLength = buffer.getInt();
            if (bodyLength < 0) {
                throw new TioDecodeException("头部4byte标识的数据长度是0");
            }
            //数据长度+头部4byte的长度大于可取得的数据长度,说明是半包,无法解析成完整的Packet。
            if (bodyLength + MindPackage.HEADER_LENGTH > readableLength) {
                return null;
            } else {
                MindPackage mindPackage = new MindPackage();
                byte[] bytes = new byte[bodyLength];
                //getInt已经把头部的四个字节读取掉了,position在4的位置,把剩下的数据装入容器
                buffer.get(bytes);
                mindPackage.setBody(bytes);
                return mindPackage;
            }
        }
    
        /**
         * 编码
         *
         * @param packet
         * @param tioConfig
         * @param channelContext
         * @return
         * @author: tanyaowu
         */
        @Override
        public ByteBuffer encode(Packet packet, TioConfig tioConfig, ChannelContext channelContext) {
            MindPackage mindPackage = (MindPackage) packet;
            byte[] body = mindPackage.getBody();
            int bodyLength = 0;
            if (body != null) {
                bodyLength = body.length;
            }
            //初始化ByteBuffer,长度为数据长度+标识数据长度的头部4byte字节。
            ByteBuffer byteBuffer = ByteBuffer.allocate(bodyLength + MindPackage.HEADER_LENGTH);
            byteBuffer.order(tioConfig.getByteOrder());
            //获取存放在头部的四个字节,即数据字节的长度。这里要与服务器的解码约定一致:即头部4byte存放数据长度。
            byteBuffer.putInt(bodyLength);
            if (body != null) {
                //存放数据
                byteBuffer.put(body);
            }
            return byteBuffer;
        }
    
        /**
         * 处理消息包
         *
         * @param packet
         * @param channelContext
         * @throws Exception
         * @author: tanyaowu
         */
        @Override
        public void handler(Packet packet, ChannelContext channelContext) throws Exception {
            //处理解码后的消息
            MindPackage mindPackage = (MindPackage) packet;
            //将byte数据转utf8字符串输出。
            System.out.println(new String(mindPackage.getBody(), MindPackage.CHARSET));
        }
    }
    

  • 客户端监听器
    package com.example.mindsa.client;
    
    import org.tio.client.intf.ClientAioListener;
    import org.tio.core.ChannelContext;
    import org.tio.core.intf.Packet;
    
    public class ClientAioListenerImpl implements ClientAioListener {
        @Override
        public void onAfterConnected(ChannelContext channelContext, boolean b, boolean b1) throws Exception {
    
        }
    
        @Override
        public void onAfterDecoded(ChannelContext channelContext, Packet packet, int i) throws Exception {
    
        }
    
        @Override
        public void onAfterReceivedBytes(ChannelContext channelContext, int i) throws Exception {
    
        }
    
        @Override
        public void onAfterSent(ChannelContext channelContext, Packet packet, boolean b) throws Exception {
    
        }
    
        @Override
        public void onAfterHandled(ChannelContext channelContext, Packet packet, long l) throws Exception {
    
        }
    
        @Override
        public void onBeforeClose(ChannelContext channelContext, Throwable throwable, String s, boolean b) throws Exception {
    
        }
    }
    

  • 服务端处理器
    package com.example.mindsa.server;
    
    import org.tio.core.ChannelContext;
    import org.tio.core.TioConfig;
    import org.tio.core.intf.Packet;
    import org.tio.server.intf.ServerAioHandler;
    
    import java.nio.ByteBuffer;
    
    public class ServerAioHandlerImpl implements ServerAioHandler {
    
        /**
         * 根据ByteBuffer解码成业务需要的Packet对象.
         * 如果收到的数据不全,导致解码失败,请返回null,在下次消息来时框架层会自动续上前面的收到的数据
         *
         * @param buffer         参与本次希望解码的ByteBuffer
         * @param limit          ByteBuffer的limit
         * @param position       ByteBuffer的position,不一定是0哦
         * @param readableLength ByteBuffer参与本次解码的有效数据(= limit - position)
         * @param channelContext
         * @return
         */
        @Override
        public Packet decode(ByteBuffer buffer, int limit, int position, int readableLength, ChannelContext channelContext){
    
            return null;
        }
    
        /**
         * 编码
         *
         * @param packet
         * @param tioConfig
         * @param channelContext
         * @return
         * @author: tanyaowu
         */
        @Override
        public ByteBuffer encode(Packet packet, TioConfig tioConfig, ChannelContext channelContext) {
            return null;
        }
    
        /**
         * 处理消息包
         *
         * @param packet
         * @param channelContext
         * @throws Exception
         * @author: tanyaowu
         */
        @Override
        public void handler(Packet packet, ChannelContext channelContext) throws Exception {
    
        }
    }
    

  • 服务端监听器
    package com.example.mindsa.server;
    
    import org.tio.core.ChannelContext;
    import org.tio.core.intf.Packet;
    import org.tio.server.intf.ServerAioListener;
    
    public class ServerAioListenerImpl implements ServerAioListener {
        @Override
        public boolean onHeartbeatTimeout(ChannelContext channelContext, Long aLong, int i) {
            return false;
        }
    
        @Override
        public void onAfterConnected(ChannelContext channelContext, boolean b, boolean b1) throws Exception {
    
        }
    
        @Override
        public void onAfterDecoded(ChannelContext channelContext, Packet packet, int i) throws Exception {
    
        }
    
        @Override
        public void onAfterReceivedBytes(ChannelContext channelContext, int i) throws Exception {
    
        }
    
        @Override
        public void onAfterSent(ChannelContext channelContext, Packet packet, boolean b) throws Exception {
    
        }
    
        @Override
        public void onAfterHandled(ChannelContext channelContext, Packet packet, long l) throws Exception {
    
        }
    
        @Override
        public void onBeforeClose(ChannelContext channelContext, Throwable throwable, String s, boolean b) throws Exception {
    
        }
    }
    

    启动客户端:

    package com.example.mindsa.client;
    
    import org.tio.client.ClientChannelContext;
    import org.tio.client.ClientTioConfig;
    import org.tio.client.ReconnConf;
    import org.tio.client.TioClient;
    import org.tio.core.Node;
    import org.tio.core.Tio;
    
    public class ClientStarter {
        public static void main(String[] args) throws Exception {
            ClientTioConfig clientTioConfig = new ClientTioConfig(new ClientAioHandlerImpl(), new ClientAioListenerImpl(), new ReconnConf());
            TioClient tioClient = new TioClient(clientTioConfig);
            ClientChannelContext connect = tioClient.connect(new Node("127.0.0.1", 8080));
            Tio.send(connect, new MindPackage());
        }
    }
    

    启动服务端

    package com.example.mindsa.server;
    
    import org.tio.server.ServerTioConfig;
    import org.tio.server.TioServer;
    
    import java.io.IOException;
    
    public class ServerStarter {
        public static void main(String[] args) throws IOException {
            ServerTioConfig serverTioConfig = new ServerTioConfig(new ServerAioHandlerImpl(), new ServerAioListenerImpl());
            TioServer tioServer = new TioServer(serverTioConfig);
            tioServer.start(null, 8080);
        }
    }
    

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/186620.html原文链接:https://javaforall.net

(0)
上一篇 2022年10月2日 下午9:00
下一篇 2022年10月2日 下午9:00


相关推荐

  • 笃志前行——一个四非一本院校计算机学子保研之路

    笃志前行——一个四非一本院校计算机学子保研之路之前看了许许多多保研经验帖 如今我也写下这篇文章 希望帮助到各位学弟学妹们 曾经的我是想出国的 但是有位学长 真的很感激他 帮了我很大忙 和我说复旦希望很大 因此在大三上就决定走保研这条路了 不过呢 我还是建议大家可以去美国还是去美国吧 我是因为从小就特别憧憬复旦 所以选择放弃出国了 这篇文章主要分为两个部分 一个是夏令营情况 一个是九推的情况 夏令营一般 5 月就要关注并报名和投材料了

    2026年3月19日
    1
  • C#面试题集_c++面试题库

    C#面试题集_c++面试题库//题目:找出字符串中出现次数最多的字符及出现次数publicstaticvoidFun(){stringstr=”iamamandag!”;Dictionaryd=newDictionary();for(inti=0;i

    2022年8月29日
    4
  • MATLAB(2)–MATLAB矩阵的表示

    MATLAB(2)–MATLAB矩阵的表示MATLAB–MATLAB矩阵的表示矩阵的建立冒号表达式linspace结构矩阵单元矩阵最后矩阵的建立利用直接输入法建立矩阵:将矩阵的元素用中括号括起来,按矩阵的顺序输入各元素,同一行的各元素之间用逗号或者空格分隔,不同的元素之间用分号分隔。利用已建好的矩阵建立更大的矩阵:一个大矩阵可以由已经建立好的小矩阵拼接而成。可以用实部矩阵和虚部矩阵构成复数矩阵。冒号表达式冒号是一个重要的运算符,利用它可以产生行向量。冒号表达式的一般格式为:e1:e2:e3其中,e1为初始值,e2为步长,e3为终

    2022年6月25日
    33
  • Mac下PyCharm快捷键大全

    Mac下PyCharm快捷键大全Mac 键盘符号和修饰键说明 nbsp Command nbsp Shift nbsp Option nbsp Control nbsp Return Enter nbsp Delete nbsp 向前删除键 Fn Delete nbsp 上箭头 nbsp 下箭头 nbsp 左箭头 nbsp 右箭头 nbsp PageUp Fn nbsp PageDown Fn Home nbsp Fn End nbsp Fn nbsp 右制

    2026年3月27日
    2
  • 程序设计语言概述_c语言程序设计基本概念

    程序设计语言概述_c语言程序设计基本概念许多各位转载请注明出处。http://www.cnblogs.com/hetao/archive/2010/03/17/1688388.html最近于2010年3月18日日修改。阅读指引读懂此文,需要

    2022年8月3日
    8
  • linux使用ps命令查看和控制进程_ps grep 进程

    linux使用ps命令查看和控制进程_ps grep 进程ps命令Linuxps(英文全拼:processstatus)命令用于显示当前进程的状态,类似于windows的任务管理器查看所有进程ps-A显示所有进程信息,连同命令行ps-

    2022年7月29日
    11

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号