• 网易云信:https://www.163yun.com
  • 注册地址:https://app.netease.im/regist
  • 登录地址:https://app.netease.im/login

架构设计

架构设计

操作流程

  1. 注册账号登录后台
  2. 创建网易云IM应用,获取AppKey和AppSecret。
  3. 服务端接口封装
  4. 客户端接口开发

高级群开发

简单描述下需求,游戏中由于对群成员的战绩进行分享,需要提供一个类似Web的聊天功能,在结算完成后即时向web群组中推送战绩,其实这里的聊天室名字并不太准确。因为网易云信实际上已经提供了聊天室的功能,只是的概念所指并非同一的东西。

高级群开发

界面是参照的微信、闲聊等多个即时应用设计的,采用的Vue和云信的JS。

简单来说,这个单页面其实有两个核心功能:

  • 群内聊天发送文本和图片
  • 群主推送战绩与个人名片

进入代码之前,首先还是需要将云信的架构图,多看一看,明白的它的流程,实际做起来也就心里有数了。由于这个功能,使用的比较频繁,做了三四版,已经上线的三版,隔一段时间看到就有种恶心的感觉。今天那过来又调整了下。记录下关键代码,周边知识与核心业务部分,一个是需要自己了解,一个是场景不同,不做过多赘述。作为笔记,只记关键点。

服务端接口封装

  • 接口文档地址:https://www.163yun.com/help/documents/33716973365022720
<?php
namespace app\library;
/*** 网易云信接口*/
class Nim
{private $app_key;private $app_secret;private $code_msg = [200=>"操作成功",201=>"客户端版本错误,请升级SDK!",301=>"被封禁",302=>"用户名或密码错误",316=>"IP限制",403=>"非法操作或权限不足",404=>"对象不存在",405=>"参数长度过长",406=>"对象只读",408=>"客户端请求超时",413=>"短信验证失败",414=>"参数错误",415=>"客户端网络问题",416=>"频率控制",417=>"重复操作",418=>"短信通道不可用",419=>"数量超过上限",422=>"账户被禁用",423=>"账号被禁言",431=>"HTTP请求重复",500=>"服务器内部错误",503=>"服务器繁忙",508=>"消息撤回时间超限",509=>"无效协议",514=>"服务不可用",998=>"解包错误",999=>"打包错误",//群错误码801=>"群成员人数达到上限",802=>"权限不足",803=>"群不存在",804=>"用户不在群",805=>"群类型无法匹配",806=>"创建群数量达到限制",807=>"群成员状态错误",808=>"申请成功",809=>"用户已在群中",810=>"邀请成功",811=>"账号数量超限",812=>"群已禁言,普通成员禁止发送消息。",813=>"群拉人部分成功",814=>"禁止使用群组已读服务",815=>"群管理员人员超限",//音视频、白板、通话9102=>"通道失效",9103=>"已在其他端对呼叫响应过",11001=>"通话不可达,对方已离线。",//聊天室13001=>"IM主连接状态异常",13002=>"聊天室状态异常",13003=>"黑名单账号,禁止进入聊天室!",13004=>"禁言账号,禁止发言!",13005=>"用户的聊天室昵称、头像等已被发垃圾",//特定业务10431=>"邮箱格式有误",10432=>"手机格式有误",10433=>"密码确认失败",10434=>"企业不存在",10435=>"登陆账户或密码错误",10436=>"应用不存在",10437=>"邮箱已注册",10438=>"手机已注册",10441=>"应用名已存在",];public function __construct($app_key, $app_secret){$this->app_key = $app_key;$this->app_secret = $app_secret;}/*获取随机数*/private function getNonce($size = 128){$nonce = "";$hexDigits = "0123456789abcdef";//随机字符串最大128个字符,也可以小于该数for($i=0;$i<$size;$i++){$nonce.= $hexDigits[rand(0,15)];}return $nonce;}/*计算并获取CheckSum*/private function getCheckSum($nonce, $curtime){$app_secret = $this->app_secret;$check_sum = sha1($app_secret.$nonce.$curtime);return $check_sum;}/*生成Header头信息*/private function buildHeader(){$app_key = $this->app_key;$nonce = $this->getNonce();$curtime = time();$check_sum = $this->getCheckSum($nonce, $curtime);$header = [];$header[] = "AppKey:".$app_key;$header[] = "Nonce:".$nonce;$header[] = "CurTime:".$curtime;$header[] = "CheckSum:".$check_sum;$header[]= "Content-Type:application/x-www-form-urlencoded;charset=utf8";return $header;}/*生成HTTP POST提交的字段*/private function buildPostFields($data){$ret = "";if(is_array($data) && count($data)>0){$arr = [];foreach($data as $k=>$v){array_push($arr, $k."=".urlencode($v));}$ret = join("&", $arr);}return $ret;}/*使用CURL进行远程数据提交*/private function curlPost($url, $fields, $header, $timeout=5000){$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_POST, true);curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);curl_setopt($ch, CURLOPT_HEADER, false);curl_setopt($ch, CURLOPT_HTTPHEADER, $header);curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);$result = curl_exec($ch);if($result === false){$result = curl_errno($ch);}return $result;}/*使用HTTP POST提交数据*/private function httpPost($url, $data){$header = $this->buildHeader();$fields = $this->buildPostFields($data);$json = $this->curlPost($url, $fields, $header);$ret = json_decode($json, true);return $ret;}private function toJson($var){$arr = [];if(is_array($var) && count($var) > 0){$arr = $var;}else if(is_string($var) && strpos($var, ",")){$arr = explode(",", trim($var, ","));}else{$arr[] = $var;}$json = json_encode($arr);return $json;}/*** 创建网易云通信ID* 描述:* 1.第三方帐号导入到网易云通信平台;* 2.注意accid,name长度以及考虑管理token。* 参数:* @param String $accid 必须 网易云通信ID,最大长度32字符,必须保证一个 APP内唯一(只允许字母、数字、半角下划线_、@、半角点以及半角-组成,不区分大小写,会统一小写处理* @param String $name 可选 网易云通信ID昵称,最大长度64字符,用来PUSH推送时显示的昵称* @param String $icon 可选 网易云通信ID头像URL,第三方可选填,最大长度1024*/public function createUser($data){$fields = [];//网易云通信ID,最大长度32字符,必须保证一个 APP内唯一(只允许字母、数字、半角下划线_、@、半角点以及半角-组成,不区分大小写,会统一小写处理if(!isset($data["accid"]) || empty($data["accid"])){return false;}$fields["accid"] = strtolower(strval($data["accid"]));//网易云通信ID可以指定登录token值,最大长度128字符,并更新,如果未指定,会自动生成token,并在创建成功后返回。if(isset($data["token"]) && !empty($data["token"])){$fields["token"] = $data["token"];}//网易云通信ID昵称,最大长度64字符,用来PUSH推送时显示的昵称。if(isset($data["name"]) && !empty($data["name"])){$fields["name"] = $data["name"];}//网易云通信ID头像URL,第三方可选填,最大长度1024。if(isset($data["icon"]) && !empty($data["icon"])){$fields["icon"] = $data["icon"];}//网易云通信用户email,最大长度64字符。if(isset($data["email"]) && !empty($data["email"])){$fields["email"] = $data["email"];}//网易云通信用户mobile,最大长度32字符,非中国大陆手机号码需要填写国家代码(如美国:+1-xxxxxxxxxx)或地区代码(如香港:+852-xxxxxxxx)。if(isset($data["mobile"]) && !empty($data["mobile"])){$fields["mobile"] = $data["mobile"];}//网易云通信用户性别,0表示未知,1表示男,2女表示女,其它会报参数错误。if(isset($data["gender"]) && in_array($data["gender"], [0,1,2])){$fields["gender"] = $data["gender"];}//网易云通信用户生日,最大长度16字符。if(isset($data["birth"]) && !empty($data["birth"])){$fields["birth"] = $data["birth"];}//网易云通信用户签名,最大长度256字符。if(isset($data["sign"]) && !empty($data["sign"])){$fields["sign"] = $data["sign"];}//网易云通信json属性,第三方可选填,最大长度1024字符。if(isset($data["props"]) && !empty($data["props"])){$fields["props"] = json_encode($data["props"]);}//网易云通信用户名片扩展字段,最大长度1024字符,用户可自行扩展,建议封装成JSON字符串。if(isset($data["ex"]) && !empty($data["ex"])){$fields["ex"] = json_encode($data["ex"]);}//远程提交$ret = [];$url = "https://api.netease.im/nimserver/user/create.action";$result = $this->httpPost($url, $fields);if(isset($result["code"]) && !empty($result["code"])){$ret["message"] = $this->code_msg[$result["code"]];}if(isset($result["code"]) && $result["code"]==200){$ret["error"] = 0;}else{$ret["error"] = 1;}if(isset($result["desc"]) && !empty($result["desc"])){$ret["desc"] = $result["desc"];}if(isset($result["info"]) && !empty($result["info"])){$ret["accid"] = $result["info"]["accid"];$ret["token"] = $result["info"]["token"];$ret["name"] = $result["info"]["name"];}return $ret;}/*** 获取用户名片* 描述:* 1.获取用户名片,可批量* 参数:* @param String $accids 必须 用户帐号(例如:JSONArray对应的accid串,如:["zhangsan"],如果解析出错,会报414)(一次查询最多为200)*/public function getUinfos($accids){$fields = [];//网易云通信ID,最大长度32字符,必须保证一个 APP内唯一(只允许字母、数字、半角下划线_、@、半角点以及半角-组成,不区分大小写,会统一小写处理if(!isset($accids) || empty($accids)){return false;}//用户帐号(例如:JSONArray对应的accid串,如:["zhangsan"],如果解析出错,会报414)(一次查询最多为200)$fields["accids"] = $this->toJson($accids);//发送请求$ret = [];$url = "https://api.netease.im/nimserver/user/getUinfos.action";$result = $this->httpPost($url, $fields);if(isset($result["code"]) && !empty($result["code"])){$ret["message"] = $this->code_msg[$result["code"]];}if(isset($result["code"]) && $result["code"]==200){$ret["error"] = 0;}else{$ret["error"] = 1;}if(isset($result["desc"]) && !empty($result["desc"])){$ret["desc"] = $result["desc"];}if(isset($result["uinfos"]) && !empty($result["uinfos"])){$cnt = count($result["uinfos"]);if($cnt == 1){foreach(current($result["uinfos"]) as $k=>$v){$ret[$k] = $v;}}elseif($cnt > 1){$ret["uinfos"] = $result["uinfos"];}}return $ret;}/*** 创建聊天室* 描述:* 参数:* @param String $creator 必须 聊天室属主的账号accid* @param String $name 必须 聊天室名称,长度限制128个字符* @param String $announcement 可选 公告,长度限制4096个字符* @param String $broadcasturl 可选 直播地址,长度限制1024个字符* @param String $queuelevel 可选 队列管理权限:0:所有人都有权限变更队列,1:只有主播管理员才能操作变更。默认0* @param String $ext 可选 扩展字段,最长4096字符* @return array*/public function createChatroom($data){$fields = [];//聊天室属主的账号accidif(!isset($data["creator"]) || empty($data["creator"])){return false;}$fields["creator"] = $data["creator"];//聊天室名称,长度限制128个字符if(!isset($data["name"]) || empty($data["name"])){return false;}$fields["name"] = $data["name"];//公告,长度限制4096个字符if(isset($data["announcement"]) && !empty($data["announcement"])){$fields["announcement"] = $data["announcement"];}//直播地址,长度限制1024个字符if(isset($data["broadcasturl"]) && !empty($data["broadcasturl"])){$fields["broadcasturl"] = $data["broadcasturl"];}//队列管理权限:0:所有人都有权限变更队列,1:只有主播管理员才能操作变更。默认0if(isset($data["queuelevel"]) && in_array($data["queuelevel"],[0,1])){$fields["queuelevel"] = $data["queuelevel"];}//扩展字段,最长4096字符if(isset($data["ext"]) && !empty($data["ext"])){$fields["ext"] = $data["ext"];}//发送请求$ret = [];$url = "https://api.netease.im/nimserver/chatroom/create.action";$result = $this->httpPost($url, $fields);if(isset($result["code"]) && !empty($result["code"])){$ret["message"] = $this->code_msg[$result["code"]];}if(isset($result["code"]) && $result["code"]==200){$ret["error"] = 0;}else{$ret["error"] = 1;}if(isset($result["desc"]) && !empty($result["desc"])){$ret["desc"] = $result["desc"];}if(isset($result["chatroom"]) && !empty($result["chatroom"])){$chatroom = $result["chatroom"];$ret["roomid"] = $chatroom["roomid"];$ret["valid"] = $chatroom["valid"];$ret["announcement"] = $chatroom["announcement"];$ret["name"] = $chatroom["name"];$ret["broadcasturl"] = $chatroom["broadcasturl"];$ret["creator"] = $chatroom["creator"];$ret["ext"] = $chatroom["ext"];}return $ret;}/*** 创建群* 注意:* 所有群操作一个ip一分钟操作次数超过6000次,会返回416错误码。* 描述:* 1.创建高级群,以邀请的方式发送给用户;* 2.custom 字段是给第三方的扩展字段,第三方可以基于此字段扩展高级群的功能,构建自己需要的群;* 3.建群成功会返回tid,需要保存,以便于加人与踢人等后续操作;* 4.每个用户可创建的群数量有限制,限制值由 IM 套餐的群组配置决定,可登录管理后台查看。* 参数:* @param String $tname 必须 群名称,最大长度64字符* @param String $owner 必须 群主用户帐号,最大长度32字符* @param Array $members 必须 ["aaa","bbb"](JSONArray对应的accid,如果解析出错会报414),一次最多拉200个成员* @param String $msg 必须 邀请发送的文字,最大长度150字符* @param int $magree 必须 管理后台建群时,0不需要被邀请人同意加入群,1需要被邀请人同意才可以加入群。其它会返回414* @param int $joinmode 必须 群建好后,sdk操作时,0不用验证,1需要验证,2不允许任何人加入。其它返回414* @return*/public function createTeam($data){$fields = [];//群名称,最大长度64字符if(!isset($data["tname"]) || empty($data["tname"])){return false;}$fields["tname"] = $data["tname"];//群主用户帐号,最大长度32字符if(!isset($data["owner"]) || empty($data["owner"])){return false;}$fields["owner"] = $data["owner"];//["aaa","bbb"](JSONArray对应的accid,如果解析出错会报414),一次最多拉200个成员if(!isset($data["members"]) || empty($data["members"])){return false;}$fields["members"] = $this->toJson($data["members"]);//邀请发送的文字,最大长度150字符if(!isset($data["msg"]) || empty($data["msg"])){$data["msg"] = "【ID:{$data["owner"]}】邀请你加入【{$data["tname"]}】";}$fields["msg"] = $data["msg"];//管理后台建群时,0不需要被邀请人同意加入群,1需要被邀请人同意才可以加入群。其它会返回414if(!isset($data["magree"]) || !in_array($data["magree"],[0,1])){$data["magree"] = 0;}$fields["magree"] = $data["magree"];//群建好后,sdk操作时,0不用验证,1需要验证,2不允许任何人加入。其它返回414if(!isset($data["joinmode"]) || !in_array($data["joinmode"],[0,1,2])){$data["joinmode"] = 0;}$fields["joinmode"] = $data["joinmode"];//发送消息$ret = [];$url = "https://api.netease.im/nimserver/team/create.action";$result = $this->httpPost($url, $fields);if(isset($result["code"]) && !empty($result["code"])){$ret["message"] = $this->code_msg[$result["code"]];}if(isset($result["code"]) && $result["code"]==200){$ret["error"] = 0;}else{$ret["error"] = 1;}if(isset($result["desc"]) && !empty($result["desc"])){$ret["desc"] = $result["desc"];}if(isset($result["tid"]) && !empty($result["tid"])){$ret["tid"] = $result["tid"];}return $ret;}/*** 拉人入群* 如果邀请的人中存在加群数量超限的情况,会返回faccid* 描述:* 1.可以批量邀请,邀请时需指定群主;* 2.当群成员达到上限时,再邀请某人入群返回失败;* 3.当群成员达到上限时,被邀请人“接受邀请"的操作也将返回失败。* 参数:* @param String $tid 必须 网易云通信服务器产生,群唯一标识,创建群时会返回,最大长度128字符* @param String $owner 必须 群主用户帐号,最大长度32字符* @param String $members 必须 ["aaa","bbb"](JSONArray对应的accid,如果解析出错会报414),一次最多拉200个成员* @param int $magree 必须 管理后台建群时,0不需要被邀请人同意加入群,1需要被邀请人同意才可以加入群。其它会返回414* @param String $msg 必须 邀请发送的文字,最大长度150字符* @param String $attach 可选 自定义扩展字段,最大长度512* @return bool*/public function addTeam($data){$fields = [];//网易云通信服务器产生,群唯一标识,创建群时会返回,最大长度128字符if(!isset($data["tid"]) || empty($data["tid"])){return false;}$fields["tid"] = $data["tid"];//群主用户帐号,最大长度32字符if(!isset($data["owner"]) || empty($data["owner"])){return false;}$fields["owner"] = $data["owner"];//["aaa","bbb"](JSONArray对应的accid,如果解析出错会报414),一次最多拉200个成员if(!isset($data["members"]) || empty($data["members"])){return false;}$fields["members"] = $this->toJson($data["members"]);//邀请发送的文字,最大长度150字符if(!isset($data["msg"]) || empty($data["msg"])){$data["msg"] = "拉人入群";}$fields["msg"] = $data["msg"];//管理后台建群时,0不需要被邀请人同意加入群,1需要被邀请人同意才可以加入群。其它会返回414if(!isset($data["magree"]) || !in_array($data["magree"],[0,1])){$data["magree"] = 0;}$fields["magree"] = $data["magree"];//自定义扩展字段,最大长度512if(isset($data["attach"]) && !empty($data["attach"])){$fields["attach"] = $data["attach"];}//发送消息$ret = [];$url = "https://api.netease.im/nimserver/team/add.action";$result = $this->httpPost($url, $fields);if(isset($result["code"]) && !empty($result["code"])){$ret["message"] = $this->code_msg[$result["code"]];}if(isset($result["code"]) && $result["code"]==200){$ret["error"] = 0;}else{$ret["error"] = 1;}if(isset($result["desc"]) && !empty($result["desc"])){$ret["desc"] = $result["desc"];}return $ret;}/*** 获取某用户所加入的群信息* 描述:* 获取某个用户所加入高级群的群信息* 参数:* @param String $accid 必须 要查询用户的accid* @return*/public function joinTeams($accid){$fields = [];//要查询用户的accidif(!isset($accid) || empty($accid)){return false;}$fields["accid"] = $accid;//发送消息$ret = [];$url = 'https://api.netease.im/nimserver/team/joinTeams.action';$result = $this->httpPost($url, $fields);if(isset($result["code"]) && !empty($result["code"])){$ret["message"] = $this->code_msg[$result["code"]];}if(isset($result["code"]) && $result["code"]==200){$ret["error"] = 0;}else{$ret["error"] = 1;}if(isset($result["desc"]) && !empty($result["desc"])){$ret["desc"] = $result["desc"];}if(isset($result["infos"]) && !empty($result["infos"])){$ret["infos"] = $result["infos"];}return $ret;}/*** 发送自定义系统通知* 描述:* 1、自定义系统通知区别于普通消息,方便开发者进行业务逻辑的通知;* 2、目前支持两种类型:点对点类型和群类型(仅限高级群),根据msgType有所区别。* 参数:* @param String $from 必须 发送者accid,用户帐号,最大32字符,必须保证一个APP内唯一* @param int    $msgtype 必须 0:点对点自定义通知,1:群消息自定义通知,其他返回414* @param String $to 必须 msgtype==0是表示accid即用户id,msgtype==1表示tid即群id* @param String $body 必须 消息内容,最大4096字符* @return*/public function sendAttachMsg($from, $to, $attach, $msgtype=1){$fields = [];//发送者accid,用户帐号,最大32字符,必须保证一个APP内唯一if(!isset($from) || empty($from)){return false;}$fields["from"] = $from;//0:点对点自定义通知,1:群消息自定义通知,其他返回414if(!isset($msgtype) || !in_array($msgtype,[0,1])){return false;}$fields["msgtype"] = $msgtype;//msgtype==0是表示accid即用户id,msgtype==1表示tid即群idif(!isset($to) || empty($to)){return false;}$fields["to"] = $to;//自定义通知内容,第三方组装的字符串,建议是JSON串,最大长度4096字符if(!isset($attach) || empty($attach)){return false;}if(is_array($attach) && count($attach)){$fields["attach"] = json_encode($attach);}elseif(is_string($attach)){$fields["attach"] = $attach;}//远程提交$url = 'https://api.netease.im/nimserver/msg/sendAttachMsg.action';$ret = [];$result = $this->httpPost($url, $fields);if(isset($result["code"]) && !empty($result["code"])){$ret["message"] = $this->code_msg[$result["code"]];}if(isset($result["code"]) && $result["code"]==200){$ret["error"] = 0;}else{$ret["error"] = 1;}if(isset($result["desc"]) && !empty($result["desc"])){$ret["desc"] = $result["desc"];}return $ret;}/*** 发送普通消息* 给用户或者高级群发送普通消息,包括文本,图片,语音,视频和地理位置* @param String $from 必须 发送者accid,用户帐号,最大32字符,必须保证一个APP内唯一* @param int $ope 必须   0:点对点个人消息,1:群消息(高级群),其他返回414* @param String $to 必须 ope==0是表示accid即用户id,ope==1表示tid即群id* @param String $type 必须 消息类型* 0 表示文本消息,* 1 表示图片,* 2 表示语音,* 3 表示视频,* 4 表示地理位置信息,* 6 表示文件,* 100 自定义消息类型(特别注意,对于未对接易盾反垃圾功能的应用,该类型的消息不会提交反垃圾系统检测)* @param String $body 必须 消息的body字段,最大长度5000字符,为一个JSON串* @param String $antispam 必须* 对于对接了易盾反垃圾功能的应用,本消息是否需要指定经由易盾检测的内容(antispamCustom)。* true或false, 默认false。* 只对消息类型为:100 自定义消息类型 的消息生效。** @return bool*/public function sendMsg($from, $to, $body, $ope=1, $type=100){$fields = [];//0:点对点个人消息,1:群消息(高级群),其他返回414if(!isset($ope) || !in_array($ope, [0,1])){return false;}$fields["ope"] = $ope;//消息类型if(!isset($type) || !in_array($type, [0,1,2,3,4,6,100])){return false;}$fields["type"] = $type;//发送者accid,用户帐号,最大32字符,必须保证一个APP内唯一if(!isset($from) || empty($from)){return false;}$fields["from"] = $from;//ope==0是表示accid即用户id,ope==1表示tid即群idif(!isset($to) || empty($to)){return false;}$fields["to"] = $to;//消息的body字段,最大长度5000字符,为一个JSON串if(!isset($body) || empty($body)){return false;}if(is_array($body) && count($body)){$fields["body"] = json_encode($body);}elseif(is_string($body)){$fields["body"] = $body;}//发送消息$url = 'https://api.netease.im/nimserver/msg/sendMsg.action';$result = $this->httpPost($url, $fields);if(isset($result["code"]) && !empty($result["code"])){$ret["message"] = $this->code_msg[$result["code"]];}if(isset($result["code"]) && $result["code"]==200){$ret["error"] = 0;}else{$ret["error"] = 1;}if(isset($result["desc"]) && !empty($result["desc"])){$ret["desc"] = $result["desc"];}if(isset($result["data"]) && !empty($result["data"])){$ret["msgid"] = $result["data"]["msgid"];$ret["antispam"] = $result["data"]["antispam"];}return $ret;}
}

这里只是封装了几个项目中使用到的接口,封装的流程对照接口文档,按需调整。

Web开发集成

  • JS接口文档
    https://dev.yunxin.163.com/docs/product/IM%E5%8D%B3%E6%97%B6%E9%80%9A%E8%AE%AF/SDK%E5%BC%80%E5%8F%91%E9%9B%86%E6%88%90/Web%E5%BC%80%E5%8F%91%E9%9B%86%E6%88%90/%E5%88%9D%E5%A7%8B%E5%8C%96

官网有提供好的JavaScript SDK的Demo,可参考修改。上面的Web界面与功能,代码没有分离优化,琐碎的功能点太多,也懒得从头再翻一遍。现在已经是又臭又长的了。

网易云信IM即时通讯PHP接口开发相关推荐

  1. 网易云信-IM即时通讯 微信小程序端实现

    小程序端的需求,使用网易云信的即时通讯作为咨询沟通的工具. 剥离点对点聊天功能且能独立运行的git项目: https://github.com/GstKishn/IM/ 如解决了你的燃眉之急(开发不易 ...

  2. 网易im即时聊天php怎么接入,网易云信IM即时通讯功能接入方式与流程_如何收费_企业服务汇...

    编者按:很多企业在考虑使用网易云信提供的IM即时通讯功能,对于企业应当如何接入该功能.接入方式和流程是怎样的.应当如何收费等不太清楚.企业服务汇通过评测网易云信IM即时通讯功能来告诉你答案. 网易云信 ...

  3. android 极光 环信,环信、容联云通讯、极光推送和网易云信IM即时通讯功能接入方式_部署方式_企业服务汇...

    编者按:企业在挑选IM即时通讯功能服务商时,对于企业应当如何接入其IM功能.接入方式和部署方式有哪些等问题不太清楚.今天企业服务汇通过评测环信.容联云通讯.极光推送和网易云信这四家服务商来为你详细说明 ...

  4. 网易云信IM即时通讯聊天源码SDK 并发高轻松万人并发稳定不丢消息 后端PHP 前端 安卓Java

    优势:承载用户并发同时在线都在第三方网易云信高并发轻松承载万人并发. 开发语言:后端PHP 前端安卓Java 苹果 OC PC端C# 网易云信 IM UIKit是基于 NIM SDK(网易云信 IM ...

  5. 接入网易云信IM即时通讯的微信小程序聊天室

    微信小程序开发交流qq群   173683895    承接微信小程序开发.扫码加微信. 接入流程: 初次接触网易云通信IM服务,您可以通过以下产品介绍文档了解我们的产品功能.相关概念.业务限制: 产 ...

  6. 网易云信im即时通讯,php网易云信im即时通讯,tp,demo,即时通讯

    请先配置appKey和appSecret     本demo实现了服务端和web的联调(系统通知) 服务端参考文档:开发者中心 WEB参考文档:开发者中心 目录 1.公共类 Common.php 2. ...

  7. 即时通讯音视频开发(七):音频基础及编码原理入门

    前言 即时通讯应用中的实时音视频技术,几乎是IM开发中的最后一道高墙.原因在于:实时音视频技术 = 音视频处理技术 + 网络传输技术 的横向技术应用集合体,而公共互联网不是为了实时通信设计的. 系列文 ...

  8. 即时通讯音视频开发(八):常见的实时语音通讯编码标准

    前言 即时通讯应用中的实时音视频技术,几乎是IM开发中的最后一道高墙.原因在于:实时音视频技术 = 音视频处理技术 + 网络传输技术 的横向技术应用集合体,而公共互联网不是为了实时通信设计的. 系列文 ...

  9. 即时通讯音视频开发(六):如何开始音频编解码技术的学习

    前言 即时通讯应用中的实时音视频技术,几乎是IM开发中的最后一道高墙.原因在于:实时音视频技术 = 音视频处理技术 + 网络传输技术 的横向技术应用集合体,而公共互联网不是为了实时通信设计的. 系列文 ...

最新文章

  1. R语言可视化面积图(area chart)移除轴标签与实际图形之间的空白区域实战:默认的面积图、移除轴标签与实际图形之间的空白区域
  2. iOS 工程师被要求写小程序,过分吗?| 每日趣闻
  3. local_response_normalization 和 batch_normalization
  4. java位运算符取反_java运算符
  5. 反激式开关电源中PC817与TL431的配合电路探讨
  6. 5.Qt自定义Button按钮的实现
  7. jvm内存参数配置_idea中设置JVM参数,简单理解JVM常见参数,JVM调优简单入门
  8. 未来计算机将具有图像识别 定理证明,[单选] 低温计与高温计所测温度的分界线为()。...
  9. 【英语学习】【医学】无机化学 - 化合物命名(1) - 离子化合物
  10. Eclipse EGit插件安装使用记录
  11. 马斯克亲口承认:自动驾驶的开发难度超乎想象;小米再发1.2亿股权激励;Firefox Lite 已死|极客头条...
  12. POJ 2709 Painter 【贪心算法】
  13. 【韦东山嵌入式Linux】Linux命令进阶笔记
  14. 十字链表法和邻接多重表法
  15. 20200827 plecs blockset更新版本
  16. oracle中常用函数学习
  17. VMware硬盘不足踩坑记录:扩容分区 + 删除.cache文件夹
  18. Redis学习之mset命令
  19. java邮件群发代码_基于java的邮件群发软件
  20. Nginx模块开发之http handler实现流量统计(入门篇)

热门文章

  1. 【解决方案 二十三】带单位的数值转大写人民币金额
  2. 《ROS2机器人建模URDF》8.4控制移动机器人轮子运动
  3. GIS定位和自定义图标
  4. 关于alert(12)与alert(1||2)输出问题解析
  5. 安装jupyter notebook中关于markupsafe的问题
  6. 重要性采样(importance sampling)
  7. nginx简介及作用
  8. 输入在第一行中给出一个正整数n(1)。第二行输入n个整数,用空格分开。在一行中输出最大值及最大值的最小下标,中间用一个空格分开。
  9. 小白必看:三层交换机实现VLAN互通实验(图文并茂)
  10. 金蝶K3开发-基础资料插件开发