22、实现发送文字、表情包

article/2025/5/15 14:52:49
  • 实现发送文字、表情包
    • 一、 发送原理
      • 二、 前端处理核心方法
    • 三、 后端逻辑处理函数 func dispatch(data[]byte)
    • 四、对端接收到消息后处理函数
    • 五、表情包简单逻辑
    • 六、发送图片流程
    • 七、 发送语音
    • 八、 发送视频
    • 测试

实现发送文字、表情包

一、 发送原理前端user1拼接好数据对象

Message msg={id:1,userid:2,dstid:3,cmd:10,media:1,content:txt} 转化成json字符串

jsonstr jsonstr = JSON.stringify(msg)

通过websocket.send(jsonstr)发送 后端S在recvproc中接收收数据data 并做相应的逻辑处理dispatch(data)-转发给user2 user2通过websocket.onmessage收到消息后做解析并显示

二、 前端处理核心方法

前端所有的操作都在拼接数据 如何拼接?

//发送文本消息
sendtxtmsg:function(txt){
//{id:1,userid:2,dstid:3,cmd:10,media:1,content:txt}
var msg =this.createmsgcontext();
//msg={"dstid":dstid,"cmd":cmd,"userid":userId()}
//选择某个好友/群的时候对dstid,cmd进行赋值
//userId()返回用户自己的id ,
// 从/chat/index.shtml?id=xx&token=yy中获得
//1文本类型
msg.media=1;msg.content=txt;
this.showmsg(userInfo(),msg);//显示自己发的文字
this.webSocket.send(JSON.stringify(msg))//发送
}
//发送图片消息
sendpicmsg:function(picurl){//{id:1,userid:2,dstid:3,cmd:10,media:4,// url:"http://www.baidu.com/a/log,jpg"}var msg =this.createmsgcontext();msg.media=4;msg.url=picurl;this.showmsg(userInfo(),msg)this.webSocket.send(JSON.stringify(msg))
}
//发送音频消息
sendaudiomsg:function(url,num){//{id:1,userid:2,dstid:3,cmd:10,media:3,url:"http://www.a,com/dsturl.mp3",anount:40}var msg =this.createmsgcontext();msg.media=3;msg.url=url;msg.amount = num;this.showmsg(userInfo(),msg)console.log("sendaudiomsg",this.msglist);this.webSocket.send(JSON.stringify(msg))
}

三、 后端逻辑处理函数 func dispatch(data[]byte)

 
func dispatch(data[]byte){//todo 解析data为message//todo根据message的cmd属性做相应的处理
}
func recvproc(node *Node) {for{_,data,err := node.Conn.ReadMessage()if err!=nil{log.Println(err.Error())return}//todo 对data进一步处理dispatch(data)fmt.Printf("recv<=%s",data)}
}

 

dispatch函数实现

22、实现发送文字、表情包 - 图1

const (CMD_SINGLE_MSG = 10CMD_ROOM_MSG   = 11CMD_HEART      = 0
)
type Message struct {Id      int64  `json:"id,omitempty" form:"id"`           //消息IDUserid  int64  `json:"userid,omitempty" form:"userid"`   //谁发的Cmd     int    `json:"cmd,omitempty" form:"cmd"`         //群聊还是私聊Dstid   int64  `json:"dstid,omitempty" form:"dstid"`     //对端用户ID/群IDMedia   int    `json:"media,omitempty" form:"media"`     //消息按照什么样式展示Content string `json:"content,omitempty" form:"content"` //消息的内容Pic     string `json:"pic,omitempty" form:"pic"`         //预览图片Url     string `json:"url,omitempty" form:"url"`         //服务的URLMemo    string `json:"memo,omitempty" form:"memo"`       //简单描述Amount  int    `json:"amount,omitempty" form:"amount"`   //其他和数字相关的
}
// 后端调度逻辑处理
func dispatch(data []byte) {//todo 解析data为messagemsg := Message{} //空对象,Message在上方定义了结构体err := json.Unmarshal(data, &msg)if err != nil {log.Println(err.Error())return}//todo 根据cmd对逻辑进行处理switch msg.Cmd {case CMD_SINGLE_MSG: //判断定义的常量值是否是单聊,群聊,实现相对应的业务逻辑sendMsg(msg.Dstid, data)case CMD_ROOM_MSG://todo 群聊转发逻辑case CMD_HEART: //心跳事件,保证网络的持久性,如果接到数据说明数据是正常的//todo 一般啥都不做}
}

四、对端接收到消息后处理函数

 
//初始化websocket的时候进行回调配置
this.webSocket.onmessage = function(evt){//前端message以后的处理逻辑//{"data":"}",...}if(evt.data.indexOf("}")>-1){this.onmessage(JSON.parse(evt.data));}else{console.log("recv<=="+evt.data)}}.bind(this)
onmessage:function(data){this.loaduserinfo(data.userid,function(user){this.showmsg(user,data) //显示发送的消息}.bind(this))}//消息显示函数
showmsg:function(user,msg){var data={}data.ismine = userId()==msg.userid;//console.log(data.ismine,userId(),msg.userid)data.user = user;data.msg = msg;//vue 只需要修改数据结构即可完成页面渲染this.msglist = this.msglist.concat(data)//面板重置this.reset();var that =this;//滚动到新消息处that.timer = setTimeout(function(){window.scrollTo(0, document.getElementById("convo").offsetHeight);clearTimeout(that.timer)},100)}

 

五、表情包简单逻辑

弹出一个窗口, 选择图片获得一个连接地址 调用 sendpicmsg方法开始发送流程

六、发送图片流程

弹出一个窗口, 选择图片,上传到服务器 获得一个连接地址 调用 sendpicmsg方法开始发送流程

七、 发送语音

弹出一个窗口, 选择按钮,进行录音操作,获得录音文件 上传到服务器, 获得一个连接地址 调用 sendaudiomsg方法 开始发送流程

八、 发送视频

弹出一个窗口, 选择按钮,选择视频 上传到服务器, 获得一个连接地址 调用 sendaudiomsg方法 开始发送流程

测试

 

 

 


http://chatgpt.dhexx.cn/article/EXjaY5Ru.shtml

相关文章

是谁在Go标准库的源码中植入了色情网站?

昨天&#xff0c;有网友在群里说在GitHub上发现了色情网站&#xff01; GitHub上怎么会有色情网站呢&#xff1f;网友给出了下面的截图&#xff1a; 这个出现在Go标准库中的Issue里面&#xff0c;有一个url… 该Issue地址&#xff1a;https://github.com/golang/go/issues/488…

调皮的表情图(Emoji)

调皮的表情&#xff08;Emoji&#xff09; 示例HTMLCSSJS 更多有趣示例 尽在 知屋安砖社区 示例 HTML <div class"main"><div class"emoji"><div class"emoji__eyes abs"><div class"emoji__eye"></div&…

现表情包大幅流行,今天教你们开发个人表情包网站

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 以下文章来源于腾讯云 作者&#xff1a;python学习教程 ( 想要学习Python&#xff1f;Python学习交流群&#xff1a;1039649593&#xff0c;满足你的需求…

python是世界上最好的语言表情包_语言表情包 - 语言微信表情包 - 语言QQ表情包 - 发表情 fabiaoqing.com...

如果你有一个朋友很久没跟你联系了一是他死了是他是学汉语言的三是他在期末考试如果他既是汉语言的又在准备期末考试你就当他死了吧 - 汉语言专业表情包 对方不想和你说话,向你推荐了世界上最好的语言!(PHP)_PHP_语言_对方表情 组织语言中(写作业中)_作业_语言_组织表情 …

情网

情网 我掩饰不住的慌张&#xff0c;在迫不急待地张望&#xff0c;生怕这一路是好梦一场。而你是一张无边无际的网&#xff0c;轻易就把我困在网中央&#xff0c;我越陷越深越迷惘&#xff0c;路越走越远越漫长&#xff0c;如何我才能锁住你眼光。情愿就这样守在你身旁&#xff…

javaScript基础面试题 -- 延迟加载JS有哪些方式?

延迟加载JS有哪些方式&#xff1f; js脚本放置在不同位置&#xff0c;对页面加载的不同影响defer与async的区别&#xff1a; 回答&#xff1a;defer 与 async js脚本放置在不同位置&#xff0c;对页面加载的不同影响 关于这个问题&#xff0c;首先来介绍一下&#xff0c;js脚本…

14道高频手写JS面试题及答案,巩固你的JS基础

目录 1. 手写深拷贝 2. 防抖函数 3. 节流函数 4. 模拟 instanceof 5. 全局通用的数据类型判断方法 6. 手写 call 函数 7. 手写 apply 函数 8. bind方法 9. 模拟 new 10. 类数组转化为数组的方法 11. 组合继承 12. 原型式继承 13. 实现 Object.create() 14. 数组…

javaScript基础面试题 --数据类型和考题

简单数据类型和复杂数据类型 简单类型&#xff08;基本数据类型、值类型&#xff09;&#xff1a;在存储时变量中存储的是值本身&#xff0c;包括string &#xff0c;number&#xff0c;boolean&#xff0c;undefined&#xff0c;null 复杂数据类型&#xff08;引用类型&…

分享一些常用的 JS 基础面试题

介绍 此篇属于前端算法入门系列的第一篇&#xff0c;主要介绍常用的数组方法、字符串方法、遍历方法、高阶函数、正则表达式以及相关数学知识。 前端算法入门一&#xff1a;刷算法题常用的JS基础扫盲[1]前端算法入门二&#xff1a;时间空间复杂度\&8大数据结构的JS实现[2]前…

js基础面试题总结

数据类型 什么是引用类型&#xff0c;值类型 值类型key与value的值存储再栈中&#xff08;量小&#xff09;医用类型再栈存储引用地址&#xff0c;在堆中存储数据&#xff08;量大&#xff09;把引用类型赋值给一个变量&#xff0c;是把变量的引用地址指向引用类型堆中地址 …

js基础常考面试题汇总(一)(附答案)

1.值类型和引用类型的区别 //值类型 let a 100 let b a a 200 console.log(b) //100 //引用类型 let a { age: 20 } let b a console.log(a.age) //21值类型&#xff1a;number, string, boolean, null, undefined, symbol(ES6)引用类型&#xff1a;Object(对象的子类: A…

3道js经典面试题

第一道&#xff1a; var a 10; // 全局作用域&#xff0c;全局变量。a10function foo() {// var a //的声明将被提升到到函数的顶部。// 比如:var aconsole.log(a); // 打印 undefined// 实际初始化值20只发生在这里var a 20; // local scope}foo(); 看图说话&#xff1a; 第…

2022年js基础面试题---持续更新

目录 1.javascipt的数据类型 1.1基本类型 1.2引用类型 1.3存储方式的区别 1.4 undefined和null的区别 1.5JavaScript什么情况下会返回undefined值&#xff1f; 2.javaScript数据类型检测的方法 2.1 typeof 2.2 instanceof 3.创建函数的几种方式 3.1 函数声明式 3.2…

JS 基础面试题

JS 基础面试题 1、什么是JavaScript&#xff1f; 基于对象和事件驱动可解释性脚本语言 2、JavaScript与ECMAScript的关系&#xff1f; JavaScript是ECMAScript的表现&#xff0c;ECMAScript是JavaScript的规范 3、变量的命名规则&#xff1f; 1.名字见名知义&#xff0c;…

js基础面试题

一、JavaScript的基本数据类型 1、 基本类型&#xff1a;字符串&#xff08;String&#xff09;、数字(Number)、布尔(Boolean)、对空&#xff08;Null&#xff09;、未定义&#xff08;Undefined&#xff09;、Symbol。 2、 引用数据类型&#xff1a;对象(Object)、数组(Arr…

【c++】atan2()和atan()函数

atan2()&#xff1a; &#xff08;1&#xff09;定义&#xff1a; double atan2(double y&#xff0c;double x); atan2() 函数的功能是求 y/x 的反正切值。atan2() 是 atan() 的增强版&#xff0c;能够确定角度所在的象限。 反正切函数 atan2() 和正切函数 tan() 的功能恰好…

asin、acos、atan 和 atan2 函数用法简介

函数名: asin 函数原型: double asin(double x); (x > -1 && x < 1) 功 能: 返回 x 的弧度制反正弦值 函数名: acos 函数原型: double acos(double x); (x > -1 && x < 1) 功 能: 返回的是一个数值的反余弦弧度值&#xff0c;其范围是 0…

atan2与atan的区别

目录 总结 atan2: Four-quadrant inverse tangent. atan 距离对比 总结 简而言之&#xff0c;atan2与atan的区别体现在两个方面&#xff1a; (1) atan2接收两个输入参数&#xff1b;atan只接收一个输入参数 (2) atan2对象限敏感&#xff0c;根据两个参数判断它是属于哪个象…

【Unity3D日常开发】Mathf.Atan2函数研究

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客QQ群&#xff1a;1040082875 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 最近有用到这个函数&#xff0c;就…

【计算几何】atan2函数

atan2函数 幅角 复数的模与辐角是复数三角形式表示的两个基本元素&#xff0c;复数所对应的向量长度称为复数的幅值&#xff0c;该向量与实轴正方向的夹角为复数的辐角。辐角的大小有无穷多&#xff0c;但是辐角主值唯一确定。利用复数的模和辐角&#xff0c;可以将复数表示成…