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