实现发送文字、表情包

一、 发送原理

  • 前端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收到消息后做解析并显示

二、 前端处理核心方法

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

  1. //发送文本消息
  2. sendtxtmsg:function(txt){
  3. //{id:1,userid:2,dstid:3,cmd:10,media:1,content:txt}
  4. var msg =this.createmsgcontext();
  5. //msg={"dstid":dstid,"cmd":cmd,"userid":userId()}
  6. //选择某个好友/群的时候对dstid,cmd进行赋值
  7. //userId()返回用户自己的id ,
  8. // 从/chat/index.shtml?id=xx&token=yy中获得
  9. //1文本类型
  10. msg.media=1;msg.content=txt;
  11. this.showmsg(userInfo(),msg);//显示自己发的文字
  12. this.webSocket.send(JSON.stringify(msg))//发送
  13. }
  14. //发送图片消息
  15. sendpicmsg:function(picurl){
  16. //{id:1,userid:2,dstid:3,cmd:10,media:4,
  17. // url:"http://www.baidu.com/a/log,jpg"}
  18. var msg =this.createmsgcontext();
  19. msg.media=4;
  20. msg.url=picurl;
  21. this.showmsg(userInfo(),msg)
  22. this.webSocket.send(JSON.stringify(msg))
  23. }
  24. //发送音频消息
  25. sendaudiomsg:function(url,num){
  26. //{id:1,userid:2,dstid:3,cmd:10,media:3,url:"http://www.a,com/dsturl.mp3",anount:40}
  27. var msg =this.createmsgcontext();
  28. msg.media=3;
  29. msg.url=url;
  30. msg.amount = num;
  31. this.showmsg(userInfo(),msg)
  32. console.log("sendaudiomsg",this.msglist);
  33. this.webSocket.send(JSON.stringify(msg))
  34. }

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

  1. func dispatch(data[]byte){
  2. //todo 解析data为message
  3. //todo根据message的cmd属性做相应的处理
  4. }
  5. func recvproc(node *Node) {
  6. for{
  7. _,data,err := node.Conn.ReadMessage()
  8. if err!=nil{
  9. log.Println(err.Error())
  10. return
  11. }
  12. //todo 对data进一步处理
  13. dispatch(data)
  14. fmt.Printf("recv<=%s",data)
  15. }
  16. }

dispatch函数实现

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

  1. const (
  2. CMD_SINGLE_MSG = 10
  3. CMD_ROOM_MSG = 11
  4. CMD_HEART = 0
  5. )
  6. type Message struct {
  7. Id int64 `json:"id,omitempty" form:"id"` //消息ID
  8. Userid int64 `json:"userid,omitempty" form:"userid"` //谁发的
  9. Cmd int `json:"cmd,omitempty" form:"cmd"` //群聊还是私聊
  10. Dstid int64 `json:"dstid,omitempty" form:"dstid"` //对端用户ID/群ID
  11. Media int `json:"media,omitempty" form:"media"` //消息按照什么样式展示
  12. Content string `json:"content,omitempty" form:"content"` //消息的内容
  13. Pic string `json:"pic,omitempty" form:"pic"` //预览图片
  14. Url string `json:"url,omitempty" form:"url"` //服务的URL
  15. Memo string `json:"memo,omitempty" form:"memo"` //简单描述
  16. Amount int `json:"amount,omitempty" form:"amount"` //其他和数字相关的
  17. }
  18. // 后端调度逻辑处理
  19. func dispatch(data []byte) {
  20. //todo 解析data为message
  21. msg := Message{} //空对象,Message在上方定义了结构体
  22. err := json.Unmarshal(data, &msg)
  23. if err != nil {
  24. log.Println(err.Error())
  25. return
  26. }
  27. //todo 根据cmd对逻辑进行处理
  28. switch msg.Cmd {
  29. case CMD_SINGLE_MSG: //判断定义的常量值是否是单聊,群聊,实现相对应的业务逻辑
  30. sendMsg(msg.Dstid, data)
  31. case CMD_ROOM_MSG:
  32. //todo 群聊转发逻辑
  33. case CMD_HEART: //心跳事件,保证网络的持久性,如果接到数据说明数据是正常的
  34. //todo 一般啥都不做
  35. }
  36. }

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

  1. //初始化websocket的时候进行回调配置
  2. this.webSocket.onmessage = function(evt){
  3. //前端message以后的处理逻辑
  4. //{"data":"}",...}
  5. if(evt.data.indexOf("}")>-1){
  6. this.onmessage(JSON.parse(evt.data));
  7. }else{
  8. console.log("recv<=="+evt.data)
  9. }
  10. }.bind(this)
  11. onmessage:function(data){
  12. this.loaduserinfo(data.userid,function(user){
  13. this.showmsg(user,data) //显示发送的消息
  14. }.bind(this))
  15. }
  16. //消息显示函数
  17. showmsg:function(user,msg){
  18. var data={}
  19. data.ismine = userId()==msg.userid;
  20. //console.log(data.ismine,userId(),msg.userid)
  21. data.user = user;
  22. data.msg = msg;
  23. //vue 只需要修改数据结构即可完成页面渲染
  24. this.msglist = this.msglist.concat(data)
  25. //面板重置
  26. this.reset();
  27. var that =this;
  28. //滚动到新消息处
  29. that.timer = setTimeout(function(){
  30. window.scrollTo(0, document.getElementById("convo").offsetHeight);
  31. clearTimeout(that.timer)
  32. },100)
  33. }

五、表情包简单逻辑

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

六、发送图片流程

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

七、 发送语音

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

八、 发送视频

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

测试

一定要更新我的最新git的view代码,然后重新登录哈https://gitee.com/kezuo/go-im/tree/v1.5

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

到此发送文字和图片消息就实现了