环信实现聊天功能

目录

  • 1、即时通信
    • 1.1 什么是即时通信?
    • 1.2 功能说明
  • 2 技术方案
  • 3 环信
    • 3.1 开发简介
    • 3.2 环信Console
  • 4 用户体系集成
    • 4.1 Appkey 数据结构
    • 4.2 环信 ID 数据结构
    • 4.3 环信 ID 使用规则
    • 4.4 获取管理员权限
    • 4.4.1 配置
    • 4.4.2 获取token
    • 4.5 注册环信用户
    • 4.6 测试
    • 4.7 查询环信用户信息
    • 4.8 发送消息给客户端


1、即时通信

如果想简易打造一套聊天方案参照我的,websocket聊天室的制作:
https://blog.csdn.net/ZGL_cyy/article/details/118438572

1.1 什么是即时通信?

在这里插入图片描述

1.2 功能说明

在这里插入图片描述

聊天功能,用户可以和好友或陌生人聊天。

如果是陌生人,通过聊一下功能进行打招呼,如果对方同意后,就成为了好友,可以进行聊天了。

2 技术方案

对于高并发的即时通讯实现,还是很有挑战的,所需要考虑的点非常多,除了要实现功能,还要考虑并发、流量、负载、服务器、容灾等等。虽然有难度也并不是高不可攀。

对于现实即时通讯往往有两种方案:

  • 方案一:

    • 自主实现,从设计到架构,再到实现。
    • 技术方面可以采用:Netty + WebSocket + RocketMQ + MongoDB + Redis + ZooKeeper + MySQL
  • 方案二:

    • 对接第三方服务完成。
    • 这种方式简单,只需要按照第三方的api进行对接就可以了。
    • 如:环信、网易、容联云通讯等。

如何选择呢?

如果是中大型企业做项目可以选择自主研发,如果是中小型企业研发中小型的项目,选择第二种方案即可。方案一需要有大量的人力、物力的支持,开发周期长,成本高,但可控性强。方案二,成本低,开发周期短,能够快速的集成起来进行功能的开发,只是在可控性方面来说就差了一些。

交友项目选择方案二进行实现。

3 环信

官网:https://www.easemob.com/ 稳定健壮,消息必达,亿级并发的即时通讯云

3.1 开发简介

集成:

环信和用户体系的集成主要发生在2个地方,服务器端集成和客户端集成。

3.2 环信Console

需要使用环信平台,那么必须要进行注册,登录之后即可创建应用。环信100以内的用户免费使用,100以上就要注册企业版了。

4 用户体系集成

4.1 Appkey 数据结构

当您申请了 AppKey 后,会得到一个 xxxx#xxxx 格式的字符串,字符串只能由小写字母数字组成,AppKey是环信应用的唯一标识。前半部分 org_name 是在多租户体系下的唯一租户标识,后半部分 app_name 是租户下的app唯一标识(在环信后台创建一个app时填写的应用 id 即是 app_name )。下述的 REST API 中,/{org_name}/{app_name}的请求,均是针对一个唯一的appkey进行的。目前环信注册的appkey暂不能由用户自己完成删除操作,如果对 APP 删除需要联系环信操作完成。

Appkeyxxxx分隔符xxxx
环信应用的唯一标识org_name#app_name

4.2 环信 ID 数据结构

环信作为一个聊天通道,只需要提供环信 ID (也就是 IM 用户名)和密码就够了。

名称字段名数据类型描述
环信 IDusernameString在 AppKey 的范围内唯一用户名。
用户密码passwordString用户登录环信使用的密码。

4.3 环信 ID 使用规则

当 APP 和环信集成的时候,需要把 APP 系统内的已有用户和新注册的用户和环信集成,为每个已有用户创建一个环信的账号(环信 ID),并且 APP 有新用户注册的时候,需要同步的在环信中注册。

在注册环信账户的时候,需要注意环信 ID 的规则:

  • 使用英文字母和(或)数字的组合
  • 不能使用中文
  • 不能使用 email 地址
  • 不能使用 UUID
  • 用户ID的长度在255字节以内
  • 中间不能有空格或者井号(#)等特殊字符
  • 允许的用户名正则 “[a-zA-Z0-9_-.](a~z大小写字母/数字/下划线/横线/英文句号),其他都不允许如果是大写字母会自动转成小写`
  • 不区分大小写。系统忽略大小写,认为 AA、Aa、aa、aA 都是一样的。如果系统已经存在了环信 ID 为 AA 的用户,再试图使用 aa 作为环信 ID 注册新用户,系统返回用户名重复,以此类推。但是请注意:环信 ID 在数据上的表现形式还是用户最初注册的形式,注册时候使用的大写就保存大写,是小写就保存小写。即:使用 AA 注册,环信保存的 ID 就是 AA;使用 Aa 注册,环信保存的 ID 就是 Aa,以此类推。

另:本文档中可能会交错使用“环信 ID”和“环信用户名”两个术语,但是请注意,这里两个的意思是一样的。

因为一个用户的环信 ID 和他的在 APP 中的用户名并不需要一致,只需要有一个明确的对应关系。例如,用户名是 example@easemob.com,当这个用户登录到 APP 的时候,可以登录成功之后,再登录环信的服务器,所以这时候,只需要能够从 example@easemob.com 推导出这个用户的环信 ID 即可。

4.4 获取管理员权限

环信提供的 REST API 需要权限才能访问,权限通过发送 HTTP 请求时携带 token 来体现,下面描述获取 token 的方式。说明:API 描述的时候使用到的 {APP 的 client_id} 之类的这种参数需要替换成具体的值。

重要提醒:获取 token 时服务器会返回 token 有效期,具体值参考接口返回的 expires_in 字段值。由于网络延迟等原因,系统不保证 token 在此值表示的有效期内绝对有效,如果发现 token 使用异常请重新获取新的 token,比如“http response code”返回 401。另外,请不要频繁向服务器发送获取 token 的请求,同一账号发送此请求超过一定频率会被服务器封号,切记,切记!!

client_id 和 client_secret 可以在环信管理后台的 [APP 详情页面看到。

Request Headers

参数说明
Content-Typeapplication/json

Request Body

参数说明
grant_typeclient_credentials
client_idApp的client_id,可在app详情页找到
client_secretApp的client_secret,可在app详情页找到

Response Body

参数说明
access_token有效的token字符串
expires_intoken 有效时间,以秒为单位,在有效期内不需要重复获取
application当前 App 的 UUID 值

4.4.1 配置

将用户体系集成的逻辑写入到sso系统中。

huanxin.properties

oldlu.huanxin.url=http://a1.easemob.com/
oldlu.huanxin.orgName=1105190515097562
oldlu.huanxin.appName=oldlu
oldlu.huanxin.clientId=YXA67ZofwHblEems-_Fh-17T2g
oldlu.huanxin.clientSecret=YXA60r45rNy2Ux5wQ7YYoEPwynHmUZk

说明:这配置在控制台可以找到。

package com.oldlu.sso.config;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;@Configuration
@PropertySource("classpath:huanxin.properties")
@ConfigurationProperties(prefix = "oldlu.huanxin")
@Data
public class HuanXinConfig {private String url;private String orgName;private String appName;private String clientId;private String clientSecret;}

4.4.2 获取token

package com.oldlu.sso.service;import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.oldlu.sso.config.HuanXinConfig;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;import java.time.Duration;
import java.util.HashMap;
import java.util.Map;@Service
public class HuanXinTokenService {private static final ObjectMapper MAPPER = new ObjectMapper();@Autowiredprivate HuanXinConfig huanXinConfig;@Autowiredprivate RestTemplate restTemplate;public static final String REDIS_KEY = "HX_TOKEN";@Autowiredprivate RedisTemplate<String, String> redisTemplate;private String refreshToken() {String targetUrl = this.huanXinConfig.getUrl() + this.huanXinConfig.getOrgName() + "/" + this.huanXinConfig.getAppName() + "/token";Map<String, String> param = new HashMap<>();param.put("grant_type", "client_credentials");param.put("client_id", this.huanXinConfig.getClientId());param.put("client_secret", this.huanXinConfig.getClientSecret());//请求环信接口ResponseEntity<String> responseEntity =this.restTemplate.postForEntity(targetUrl, param, String.class);if (responseEntity.getStatusCodeValue() != 200) {return null;}String body = responseEntity.getBody();try {JsonNode jsonNode = MAPPER.readTree(body);String accessToken = jsonNode.get("access_token").asText();if (StringUtils.isNotBlank(accessToken)) {// 将token保存到redis,有效期为5天,环信接口返回的有效期为6天this.redisTemplate.opsForValue().set(REDIS_KEY, accessToken, Duration.ofDays(5));return accessToken;}} catch (Exception e) {e.printStackTrace();}return null;}public String getToken() {String token = this.redisTemplate.opsForValue().get(REDIS_KEY);if (StringUtils.isBlank(token)) {return this.refreshToken();}return token;}
}

4.5 注册环信用户

注册环信用户分为2种,开放注册、授权注册,区别在于开发注册不需要token,授权注册需要token。

我们使用的授权注册:

package com.oldlu.sso.vo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@NoArgsConstructor
@AllArgsConstructor
public class HuanXinUser {private String username;private String password;}
package com.oldlu.sso.service;import com.fasterxml.jackson.databind.ObjectMapper;
import com.oldlu.sso.config.HuanXinConfig;
import com.oldlu.sso.vo.HuanXinUser;
import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;import java.util.Arrays;@Service
public class HuanXinService {private static final ObjectMapper MAPPER = new ObjectMapper();@Autowiredprivate HuanXinTokenService huanXinTokenService;@Autowiredprivate RestTemplate restTemplate;@Autowiredprivate HuanXinConfig huanXinConfig;/*** 注册环信用户** @param userId* @return*/public boolean register(Long userId) {String targetUrl = this.huanXinConfig.getUrl()+ this.huanXinConfig.getOrgName() + "/"+ this.huanXinConfig.getAppName() + "/users";String token = this.huanXinTokenService.getToken();try {// 请求体HuanXinUser huanXinUser = new HuanXinUser(String.valueOf(userId), DigestUtils.md5Hex(userId + "_itlu_oldlu"));String body = MAPPER.writeValueAsString(huanXinUser);// 请求头HttpHeaders headers = new HttpHeaders();headers.add("Content-Type", "application/json");headers.add("Authorization", "Bearer " + token);HttpEntity<String> httpEntity = new HttpEntity<>(body, headers);ResponseEntity<String> responseEntity = this.restTemplate.postForEntity(targetUrl, httpEntity, String.class);return responseEntity.getStatusCodeValue() == 200;} catch (Exception e) {e.printStackTrace();}// 注册失败return false;}}

加入到登录逻辑中:

4.6 测试

可以看到已经注册到了环信。

4.7 查询环信用户信息

在app中,用户登录后需要根据用户名密码登录环信,由于用户名密码保存在后台,所以需要提供接口进行返回。

实现:

package com.oldlu.server.controller;import com.oldlu.server.pojo.User;
import com.oldlu.server.utils.UserThreadLocal;
import com.oldlu.server.vo.HuanXinUser;
import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("huanxin")
public class HuanXinController {@GetMapping("user")public ResponseEntity<HuanXinUser> queryHuanXinUser(){User user = UserThreadLocal.get();HuanXinUser huanXinUser = new HuanXinUser();huanXinUser.setUsername(user.getId().toString());huanXinUser.setPassword(DigestUtils.md5Hex(user.getId() + "_itlu_oldlu"));return ResponseEntity.ok(huanXinUser);}
}

4.8 发送消息给客户端

目前已经完成了用户体系的对接,下面我们进行测试发送消息,场景是这样的:

点击“聊一下”,就会给对方发送一条陌生人信息,这个消息由系统发送完成。

消息内容:

{"userId": "1","nickname":"老陆","strangerQuestion": "测试一下问题","reply": "aaaaa"}

可以看到已经接收到了消息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/31367.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android泡泡聊天界面的实现

昨天写了个界面&#xff0c;实现了Android泡泡聊天界面。运行结果如下&#xff0c;点击发送按钮&#xff0c;屏幕就显示Text的内容。 我也是在网上的一份源码的基础上更改的&#xff0c;整个泡泡界面的实现要点&#xff1a; &#xff08;1&#xff09;主界面其实就是一个List V…

【开源免费】使用Spring Boot和Html实现ChatGPT,1:亿还原,将就看。

简介 关注我&#xff1a;GPT4.0 JAVA SDK近期更新 前段时间写了一个Chatgpt的Java版SDK开源地址&#xff1a;chatgpt-java欢迎使用。但由于原来OpenAI 并没有支持官网的chatgpt模型&#xff0c;所以使用起来相对没有官网那么智能完善&#xff0c;所以就没有写出一个demo项目&a…

Fdog系列(五):使用Qt模仿QQ实现登录界面到主界面,功能篇。

文章目录 一. 前言同时完整项目代码已上传github&#xff1a;[Fdog即时通讯软件](https://github.com/HuaGouFdog/FdogInstantMessaging) 求星星&#xff01;二. 正文1. 如何保存第一次登录数据2. 如何获取已经登录过的账号信息,并完成自定义下列框3. 从下拉列表框删除账号4. 文…

可换皮肤的Qt登录界面

⭐️我叫忆_恒心,一名喜欢书写博客的在读研究生👨‍🎓。 如果觉得本文能帮到您,麻烦点个赞👍呗! 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧,喜欢的小伙伴给个三连支持一下呗。👍⭐️❤️ 可换皮肤的Qt登录界面 QSS的学习笔记 快…

chatgpt赋能python:Python如何去除停用词

Python 如何去除停用词 介绍 在进行自然语言处理时&#xff0c;停用词是常见的障碍。停用词是指在文本中频繁出现但没有实际意义的词语。例如&#xff0c;“the”、“is”、“a” 等单词通常被认为是停用词&#xff0c;因为它们在具有意义的文本中出现得非常频繁&#xff0c;…

使用关联规则分析股票数据--数据来自tushare大数据社区

使用关联规则分析股票数据--数据来自tushare大数据社区 一、开发环境二、目标三、关联规则&#xff08;之前了解过直接跳到第四步&#xff09;1.关联规则的定义2.啤酒尿布的例子2.1 支持度2.2置信度2.3 提升度2.4 关联规则2.5 啤酒和尿布 四、股票关联规则分析1.使用的库2.获取…

Twitter部分源代码泄漏、疑遭离职员工报复:马斯克要求GitHub交出所有上传、下载人员名单...

点击“开发者技术前线”&#xff0c;选择“星标” 让一部分开发者看到未来 作者 &#xff5c; Tina 来自&#xff1a;AI前线 最近的法律文件显示&#xff0c;Twitter 的部分源代码已经在网上泄露。这是一次罕见的、严重的知识产权泄露事件。为防止该事件对其服务产生潜在的破坏…

马斯克刚说要开源,没几天Twitter源代码就泄漏了...

出品 | OSC开源社区&#xff08;ID&#xff1a;oschina2013) 根据《纽约时报》的报道&#xff0c;一份法律文件显示&#xff0c;Twitter 称其部分源代码在网上被泄露&#xff0c;该公司已于上周五采取行动&#xff0c;它通过向托管代码的 GitHub 发送版权侵权通知&#xff0c;删…

文心一言员工跳槽工资翻倍, AI 人才备受追捧;推特称其部分源代码遭泄露;Docker 撤回受争议的收费方案|极客头条...

「极客头条」—— 技术人员的新闻圈&#xff01; CSDN 的读者朋友们早上好哇&#xff0c;「极客头条」来啦&#xff0c;快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 梦依丹 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 一分钟速览新闻点&#…

有道智云翻译API + retrofit实现在线翻译Android app

目录 1.进入有道智云主页&#xff0c;注册自己的账号(手机号验证码)&#xff0c;完善信息随意填 2.登录进来后&#xff0c;创建应用。根据需要选择语言翻译服务。 3. 打开Android Studio&#xff0c;新建空的Activity项目 1. 新建项目&#xff0c;在build.gradle(app)添加re…

STRAIGHT声码器详解

转载请注明出处。 STRAIGHT自适应加权谱内插的语音转换与重构 STRAIGHT&#xff08; Speech Transformation and Representation using Adaptive Interpolation of weighted spectrum)算法&#xff08;Kawahara,1998&#xff09;&#xff0c;是一种语音信号分析、合成、修改的…

chatgpt赋能python:如何用Python挣钱:从小白到大佬的必备指南

如何用Python挣钱&#xff1a;从小白到大佬的必备指南 作为一名有10年Python编程经验的工程师&#xff0c;我深知Python的应用范围非常广泛&#xff0c;它可以为各种行业带来巨大的价值。当然&#xff0c;对于许多人来说&#xff0c;如果你是一名SEO从业者&#xff0c;也完全可…

chatgpt赋能python:如何利用Python在网上赚钱:一份SEO指南

如何利用Python在网上赚钱&#xff1a;一份SEO指南 随着互联网的快速发展和Python成为一种越来越受欢迎的编程语言&#xff0c;越来越多的人开始利用Python在网上赚取额外的收入。本篇文章将介绍一些Python工具和技术&#xff0c;以及SEO最佳实践&#xff0c;帮助你利用Python…

PHP短信验证功能

PHP阿里大鱼短信验证 第一步 登陆阿里大于注册账号&#xff0c;在用户管理中心创建应用&#xff0c;确定AppKEY和App Secret还有配置签名 第二步 在应用管理中选择SDK下载&#xff0c;或者直接点击http://download.csdn.net/detail/s371795639/9695983下载&#xff0c;免费的…

发送短信验证码 API数据接口

1.前言 此接口发送短信验证码 短信模板 参数说明: 1449978 验证码为&#xff1a;{1}为您的登录验证码&#xff0c;请于{2}分钟内填写&#xff0c;如非本人操作&#xff0c;请忽略本短信。 1449979 验证码为&#xff1a;{1}&#xff0c;您正在登录&#xff0c;若非本人操作&…

为何语言学家乔姆斯基对ChatGPT持否定态度?

本文比较了乔姆斯基关于语言知识的本质、来源和使用的理论与 GPT 的不同&#xff0c; 说明了GPT没有可解释性。 2023年3月8日著名语言学家乔姆斯基与罗伯茨&#xff08;Ian Roberts&#xff09;、瓦图穆尔&#xff08;Jeffrey Watmull&#xff09;共同在《纽约时报》发表了题为…

如何更换您的Gmail地址

在许多情况下&#xff0c;您可能需要更改您的 Gmail 地址&#xff1a;您换了工作、结婚并改了名字&#xff0c;或者您在 2003 年设置的电子邮件地址突然看起来有点累了。无论出于何种原因&#xff0c;以下是更改 Gmail 地址并确保您在此过程中不会丢失任何重要数据的方法。 创…

将163邮箱改为使用outlook软件登录的切换步骤

效果图&#xff1a; 实际操作步骤如下&#xff1a; 1. 登录163.邮箱&#xff0c;如下是使用网页版登录&#xff1b;按照下面要求&#xff0c;扫描二维码 2. 找个txt文件&#xff0c;保存此 一次性密码&#xff0c;后面步骤有用。 3.检查当前状态&#xff1b; 两个都是“已开…

Becky!客户端Hotmail/outlook邮箱设置方法

Becky!邮箱客户端是一款非常简洁好用的邮件接收发送软件。最近本软件菜单增加了对中的支持&#xff0c;感谢作者的不懈努力。 日语版本下载地址&#xff1a; http://www.rimarts.co.jp/becky-j.htm 中文菜单版本&#xff1a; http://www.zhcn.org/wp-content/plugins/download…

Gmail,qq,hotmail,163,sina等邮箱的Smtp设置

Gmail SMTP 服务器&#xff1a;smtp.gmail.com&#xff0c; SSL&#xff1a;是&#xff0c;服务器端口&#xff1a;587&#xff0c;见下图&#xff1a; Hotmail SMTP 服务器&#xff1a;smtp.live.com&#xff0c; SSL&#xff1a;是&#xff0c;服务器端口&#xff1a;587&…