码云上面有案例
客户端和服务端
客户端
多台机器测试的时候,把客户端绑定服务端的ip给换了(端口要和服务端保持一致)
Node serverNode = new Node("192.168.31.38", 6000);
接着构建客户端配置信息
客户端可以配置
业务回调器(不可以为NULL) 回调是被动接受
事件监听器 监听是主动执行
等等 …
ImClientConfig imClientConfig = ImClientConfig.newBuilder()
//客户端业务回调器,不可以为NULL
.clientHandler(new HelloImClientHandler())
//客户端事件监听器,可以为null,但建议自己实现该接口
.clientListener(new HelloImClientListener())
//心跳时长不设置,就不发送心跳包
//.heartbeatTimeout(5000)
//断链后自动连接的,不想自动连接请设为null
//.reConnConf(new ReconnConf(5000L))
.build();
然后生成客户端对象
连接服务器
服务端
先启动服务端,在启动客户端
启动类先加载配置文件
设置群组监听器,非必须
设置绑定用户监听器,非必须
ImServerConfig imServerConfig = new PropertyImServerConfigBuilder("config/jim.properties").build();
//初始化SSL;(开启SSL之前,你要保证你有SSL证书哦...)
initSsl(imServerConfig);
//设置群组监听器,非必须,根据需要自己选择性实现;
imServerConfig.setImGroupListener(new ImDemoGroupListener());
//设置绑定用户监听器,非必须,根据需要自己选择性实现;
imServerConfig.setImUserListener(new ImDemoUserListener());
JimServer jimServer = new JimServer(imServerConfig);
还可以自定义处理器
修改配置文件
jim.properties
接下来,把客户端和服务端的流程走一遍:
1.启动服务端
2.启动客户端
当客户端发送一次请求的时候
private static void send() throws Exception {
//也可以自定义LoginReBody的参数
byte[] loginBody = new LoginReqBody("hello_client","123").toByte();
TcpPacket loginPacket = new TcpPacket(Command.COMMAND_LOGIN_REQ,loginBody);
//先登录;
JimClientAPI.send(imClientChannelContext, loginPacket);
ChatBody chatBody = ChatBody.newBuilder()
.from("hello_client")
.to("admin")
.msgType(0)
.chatType(ChatType.CHAT_TYPE_PUBLIC.getNumber())
.groupId("100")
.content("Socket普通客户端消息测试!").build();
TcpPacket chatPacket = new TcpPacket(Command.COMMAND_CHAT_REQ,chatBody.toByte());
JimClientAPI.send(imClientChannelContext, chatPacket);
}
服务器端的群组监听器或者个人监听器,监控到了
重写一些方法,例如:
@Override
public void doAfterBind(ImChannelContext imChannelContext, Group group) throws ImException {
logger.info("群组:{},绑定成功!", JsonKit.toJSONString(group));
JoinGroupRespBody joinGroupRespBody = JoinGroupRespBody.success();
//回一条消息,告诉对方进群结果
joinGroupRespBody.setGroup(group.getGroupId());
ImPacket respPacket = ProtocolManager.Converter.respPacket(joinGroupRespBody, imChannelContext);
//Jim.send(imChannelContext, respPacket);
//发送进房间通知;
joinGroupNotify(group, imChannelContext);
}
以上方法是为了通知客户端一些信息
于此同时,服务端还会处理一些逻辑,依据服务端配置的处理器
比如说登录业务的处理器
LoginReqHandler loginReqHandler = CommandManager.getCommand(Command.COMMAND_LOGIN_REQ,LoginReqHandler.class);
loginReqHandler.setSingleProcessor(new LoginServiceProcessor());
比如,客户端传递token来,此时需要我们依据token找出对应的用户信息
就需要在LoginServiceProcessor定义方法来解决这个需求
总的来说处理器在监听器之前 走…
服务器端处理结束之后,就又到服务端了
此时客户端的回调器,会接收服务端传过来的一些信息,做处理
@Override
public void handler(ImPacket imPacket, ImChannelContext channelContext){
TcpPacket helloPacket = (TcpPacket)imPacket;
byte[] body = helloPacket.getBody();
if (body != null)
{
try {
String str = new String(body, ImConst.CHARSET);
logger.info("demo客户端收到消息:{}", str);
}catch (Exception e){
logger.error(e.getMessage(), e);
}
}
return;
}
以上是处理消息的实现方法