开源项目jIm学习

gitee 地址:https://gitee.com/xchao/j-im

J-IM 是用JAVA语言,基于t-io开发的轻量、高性能、单机支持几十万至百万在线用户IM,主要目标降低即时通讯门槛,快速打造低成本接入在线IM系统,通过极简洁的消息格式就可以实现多端不同协议间的消息发送如内置(Http、Websocket、Tcp自定义IM协议)等,并提供通过http协议的api接口进行消息发送无需关心接收端属于什么协议,一个消息格式搞定一切!

gitee 地址 :https://gitee.com/tywo45/t-io

t-io是基于aio(nio2)的网络编程框架,和netty属于同类,但t-io更注重一线开发工程师的感受,提供了大量和业务相关的API。基于t-io来开发IM、TCP私有协议、RPC、游戏服务器端、推送服务、实时监控、物联网、UDP、Socket将会变得空前的简单。

https://www.t-io.org

 

在已有的基础上编写 HelloClientAioHandler 和 HelloClientStarter,server端提供消息服务,需用户注册信息上去,client端用户发送消息。

public class HelloClientAioHandler implements AioHandler, ClientAioHandler {

    private  static TcpPacket heartbeatPacket = new TcpPacket(Command.COMMAND_HEARTBEAT_REQ,new byte[]{Protocol.HEARTBEAT_BYTE});
    @Override
    public Packet heartbeatPacket() {
        return heartbeatPacket;
    }

    /**
     * j-im 已经帮我们处理好了,分别在 TcpServerEncode.encode 和 TcpServerDecoder.decode 中,调用即可
     * 如果不是基于 j-im 来开发客户端的话,自己按照上面介绍的协议结构封装好编解码就可以了
     *
     * @param byteBuffer
     * @param i
     * @param i1
     * @param i2
     * @param channelContext
     * @return
     * @throws AioDecodeException
     */
    @Override
    public Packet decode(ByteBuffer byteBuffer, int i, int i1, int i2, ChannelContext channelContext) throws AioDecodeException {
        return TcpServerDecoder.decode(byteBuffer, channelContext);
    }

    @Override
    public ByteBuffer encode(Packet packet, GroupContext groupContext, ChannelContext channelContext) {
        TcpPacket tcpPacket = (TcpPacket) packet;
        return TcpServerEncoder.encode(tcpPacket, groupContext, channelContext);
    }

    /**
     * 处理消息
     *
     * @param packet
     * @param channelContext
     * @throws Exception
     */
    @Override
    public void handler(Packet packet, ChannelContext channelContext) throws Exception {
        TcpPacket helloPacket = (TcpPacket) packet;
        byte[] body = helloPacket.getBody();
        if (body != null) {
            //处理
            String msgContent = new String(body, Const.CHARSET);
            System.out.println("111:::::" + msgContent);
        }
    }
}

 

public class HelloClientStarter {

    public static Node serverNode = new Node("127.0.0.1", Const.SERVER_PORT);

    public static ClientAioHandler aioHandler = new HelloClientAioHandler();

    public static ClientAioListener aioListener = null;

    private static ReconnConf reconnConf = new ReconnConf(5000L);

    public static ClientGroupContext clientGroupContext = new ClientGroupContext(aioHandler, aioListener, reconnConf);

    public static AioClient aioClient = null;

    public static ClientChannelContext clientChannelContext = null;

    public static void main(String[] args) throws Exception {
        clientGroupContext.setHeartbeatTimeout(0);
        aioClient = new AioClient(clientGroupContext);
        clientChannelContext = aioClient.connect(serverNode);
        //登陆test/admin
        BufferedReader brName = new BufferedReader(new InputStreamReader(System.in));
        byte[] loginBody = new LoginReqBody(brName.readLine(), brName.readLine()).toByte();
        TcpPacket loginPacket = new TcpPacket(Command.COMMAND_LOGIN_REQ, loginBody);
        Aio.send(clientChannelContext, loginPacket);
        while (true) {
            brName = new BufferedReader(new InputStreamReader(System.in));
            ChatBody chatBody = new ChatBody().setFrom("test").setTo("admin").setMsgType(0).setChatType(1).setGroup_id("100").setContent(brName.readLine());
            TcpPacket chatTcpPacket = new TcpPacket(Command.COMMAND_CHAT_REQ, chatBody.toByte());
            Aio.send(clientChannelContext, chatTcpPacket);
        }
    }

//    private static void send() throws Exception{
//        byte[] loginBody = new LoginReqBody("test", "123").toByte();
//        TcpPacket loginPacket = new TcpPacket(Command.COMMAND_LOGIN_REQ, loginBody);
//        Aio.send(clientChannelContext, loginPacket);
//        ChatBody chatBody = new ChatBody().setFrom("test").setTo("admin").setMsgType(0).setChatType(1).setGroup_id("100").setContent("ccccccccccccccccc");
//        TcpPacket chatTcpPacket = new TcpPacket(Command.COMMAND_CHAT_REQ, chatBody.toByte());
//        Aio.send(clientChannelContext,chatTcpPacket);
//    }

    private static void send(String name) throws Exception {
        byte[] loginBody = new LoginReqBody(name, "123").toByte();
        TcpPacket loginPacket = new TcpPacket(Command.COMMAND_LOGIN_REQ, loginBody);
        Aio.send(clientChannelContext, loginPacket);
        ChatBody chatBody = new ChatBody().setFrom("test").setTo("admin").setMsgType(0).setChatType(1).setGroup_id("100").setContent("ccccccccccccccccc");
        TcpPacket chatTcpPacket = new TcpPacket(Command.COMMAND_CHAT_REQ, chatBody.toByte());
        Aio.send(clientChannelContext, chatTcpPacket);
    }

}

 

Java中NIO、BIO、IO

NIO:https://blog.csdn.net/u011381576/article/details/79876754

https://www.cnblogs.com/kzfy/p/5063467.html

 

http://www.cnblogs.com/ygj0930/p/6543960.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值