当前位置: 首页 > 工具软件 > J-IM > 使用案例 >

J-IM框架的体会

熊嘉茂
2023-12-01

码云上面有案例
客户端和服务端

客户端
多台机器测试的时候,把客户端绑定服务端的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;
	}

以上是处理消息的实现方法

 类似资料: