微信小程序WebSocket实现聊天对话功能


Posted in Javascript onJuly 06, 2018

本文实例为大家分享了微信小程序WebSocket实现聊天对话功能的具体代码,供大家参考,具体内容如下

js

var app = getApp();
var socketOpen = false;
var frameBuffer_Data, session, SocketTask;
var url = 'ws://请填写您的长链接接口地址';
var upload_url ='请填写您的图片上传接口地址'
Page({
 data: {
  user_input_text: '',//用户输入文字
  inputValue: '',
  returnValue: '',
  addImg: false,
  //格式示例数据,可为空
  allContentList: [],
  num: 0
 },
 // 页面加载
 onLoad: function () {
  this.bottom();
 },
 onShow: function (e) {
  if (!socketOpen) {
   this.webSocket()
  }
 },
 // 页面加载完成
 onReady: function () {
  var that = this;
  SocketTask.onOpen(res => {
   socketOpen = true;
   console.log('监听 WebSocket 连接打开事件。', res)
  })
  SocketTask.onClose(onClose => {
   console.log('监听 WebSocket 连接关闭事件。', onClose)
   socketOpen = false;
   this.webSocket()
  })
  SocketTask.onError(onError => {
   console.log('监听 WebSocket 错误。错误信息', onError)
   socketOpen = false
  })
  SocketTask.onMessage(onMessage => {
   console.log('监听WebSocket接受到服务器的消息事件。服务器返回的消息', JSON.parse(onMessage.data))
   var onMessage_data = JSON.parse(onMessage.data)
   if (onMessage_data.cmd == 1) {
    that.setData({
     link_list: text
    })
    console.log(text, text instanceof Array)
    // 是否为数组
    if (text instanceof Array) {
     for (var i = 0; i < text.length; i++) {
      text[i]
     }
    } else {
 
    }
    that.data.allContentList.push({ is_ai: true, text: onMessage_data.body });
    that.setData({
     allContentList: that.data.allContentList
    })
    that.bottom()
   }
  })
 },
 webSocket: function () {
  // 创建Socket
  SocketTask = wx.connectSocket({
   url: url,
   data: 'data',
   header: {
    'content-type': 'application/json'
   },
   method: 'post',
   success: function (res) {
    console.log('WebSocket连接创建', res)
   },
   fail: function (err) {
    wx.showToast({
     title: '网络异常!',
    })
    console.log(err)
   },
  })
 },
 
 // 提交文字
 submitTo: function (e) {
  let that = this;
  var data = {
   body: that.data.inputValue,
  }
 
  if (socketOpen) {
   // 如果打开了socket就发送数据给服务器
   sendSocketMessage(data)
   this.data.allContentList.push({ is_my: { text: this.data.inputValue }});
   this.setData({
    allContentList: this.data.allContentList,
    inputValue: ''
   })
 
   that.bottom()
  }
 },
 bindKeyInput: function (e) {
  this.setData({
   inputValue: e.detail.value
  })
 },
 
 onHide: function () {
  SocketTask.close(function (close) {
   console.log('关闭 WebSocket 连接。', close)
  })
 },
 upimg: function () {
  var that = this;
   wx.chooseImage({
    sizeType: ['original', 'compressed'],
    success: function (res) {
     that.setData({
      img: res.tempFilePaths
     })
     wx.uploadFile({
      url: upload_url,
      filePath: res.tempFilePaths,
      name: 'img',
      success: function (res) {
       console.log(res)
        wx.showToast({
         title: '图片发送成功!',
         duration: 3000
        });
      }
     }) 
     that.data.allContentList.push({ is_my: { img: res.tempFilePaths } });
     that.setData({
      allContentList: that.data.allContentList,
     })
     that.bottom();
    }
   })
 },  
 addImg: function () {
  this.setData({
   addImg: !this.data.addImg
  })
 
 },
 // 获取hei的id节点然后屏幕焦点调转到这个节点 
 bottom: function () {
  var that = this;
  this.setData({
   scrollTop: 1000000
  })
 },
})
 
//通过 WebSocket 连接发送数据,需要先 wx.connectSocket,并在 wx.onSocketOpen 回调之后才能发送。
function sendSocketMessage(msg) {
 var that = this;
 console.log('通过 WebSocket 连接发送数据', JSON.stringify(msg))
 SocketTask.send({
  data: JSON.stringify(msg)
 }, function (res) {
  console.log('已发送', res)
 })
}

wxml

<view class='page_bg' wx:if='{{block}}' bindtap='hide_bg' />
<view class='btn_bg' wx:if='{{block}}'>
 <view wx:for="{{link_list}}" wx:key='index'>
  <button class="sp_tit" id='{{index}}' bindtap='list_item'>查看详情 {{item}} </button>
 </view>
</view>
<scroll-view class="history" scroll-y="true" scroll-with-animation scroll-top="{{scrollTop}}">
 
 <block wx:key="{{index}}" wx:for="{{allContentList}}">
  <!-- <view>
   <text class='time'>{{time}}</text>
  </view> -->
  <view class='my_right' wx:if="{{item.is_my}}">
   <view class='p_r' wx:if='{{item.is_my.text}}'>
    <text class='new_txt'><text class='new_txt_my'>{{item.is_my.text}}</text></text>
    <view class='sanjiao my'></view>
    <image class='new_img' src='/images/test.jpg'></image>
   </view>
   <view class='p_r' wx:if='{{item.is_my.img}}' bindtap='my_audio_click' data-id='{{index}}'>
    <text class='new_txt'> </text>
    <view class='my_img_bg'>
    <image class='my_audio' src='{{img}}'></image></view>
    <view class='sanjiao my'></view>
    <image class='new_img' src='/images/test.jpg'></image>
   </view>
  </view>
  <!-- <view class='you_left' id='id_{{allContentList.length}}'> -->
  <view class='you_left' id='id_{{allContentList.length}}' wx:key="{{index}}" wx:if="{{item.is_ai}}">
   <view class='p_r'>
    <image class='new_img' src='/images/chac.jpg'></image>
    <view class='sanjiao you'></view>
    <view class='new_txt'>
     <view class='new_txt_ai'>
      <!-- {{item.text}} -->
      <block wx:for='{{item.is_two}}' wx:key='index'>
       <text wx:if='{{item.text}}'>{{item.text}}</text>
       <text wx:if='{{item.a.title}}' style='color:#0000EE' bindtap='link' id='{{item.a.link}}'>{{item.a.title}}</text>
      </block>
     </view>
    </view>
   </view>
  </view>
 </block>
</scroll-view>
<view class="sendmessage">
 <image class='voice_icon' bindtap='addImg' src='/images/jia_img.png'></image>
 <block wx:if='{{!addImg}}'>
  <input type="text" bindinput="bindKeyInput" value='{{inputValue}}' focus='{{focus}}' bindfocus="focus" confirm-type="done" placeholder="" />
  <button bindtap="submitTo" class='user_input_text'>发送</button>
 </block>
 <block wx:if='{{addImg}}'>
  <view class='voice_ing' bindtap="upimg">发送图片</view>
 </block>
</view>

css

page { 
 background-color: #f2f2f2; 
 height: 100%;
} 
.jia_img{ 
 height: 80rpx; 
 width: 90rpx; 
} 
.time { 
 text-align: center; 
 padding: 5rpx 20rpx 5rpx 20rpx; 
 width: 200rpx; 
 font-size: 26rpx; 
 background-color: #E8E8E8; 
} 
.tab{
 bottom: 120rpx;
}
.tab_1{
 position: fixed;
 bottom: 50rpx;
 width: 200rpx;
 font-size: 26rpx;
 left: 50%;
 margin-left: -45rpx;
 height: 100rpx;
}
.tab_2{
 right: 30rpx;
 position: fixed;
}
/* 聊天 */ 
 
.my_right { 
 float: right; 
 margin-top: 30rpx;
 position: relative; 
 right: 40rpx; 
} 
.my_audio{
 height: 120rpx;
 width: 150rpx;
 position: absolute;
 right: 150rpx;
 background: white;
 top: 20rpx;
}
.my_img_bg{
 height: 150rpx;
 width: 400rpx;
 position: relative;
 right: 0;
 background: white;
 top: 20rpx;
}
.you_left { 
 margin-top: 30rpx;
 float: left; 
 position: relative; 
 left: 5rpx; 
} 
 
.new_img { 
 width: 100rpx; 
 height: 100rpx; 
 border-radius: 50%; 
} 
 
.new_txt { 
 width: 420rpx; 
} 
.new_txt_my{
 border-radius: 7px; 
 background-color: #fff; 
 margin-top: 10rpx;
 padding: 0rpx 30rpx 0rpx 30rpx; 
 float: right;
}
.new_txt_ai{
 border-radius: 7px; 
 background-color: #fff; 
 margin-top: 10rpx;
 padding: 0rpx 30rpx 0rpx 30rpx; 
 float: left;
}
.sanjiao { 
 top: 25rpx; 
 position: relative; 
 width: 0px; 
 height: 0px; 
 border-width: 15rpx; 
 border-style: solid; 
} 
 
.my { 
 border-color: transparent transparent transparent #fff; 
} 
 
.you { 
 border-color: transparent #fff transparent transparent; 
} 
 
.sendmessage { 
 width: 100%; 
 z-index: 2;
 display: flex; 
 position: fixed;
 bottom: 0px;
 background-color: #F4F4F6; 
 flex-direction: row; 
 height: 85rpx;
} 
.voice_icon{
 width: 60rpx;
 height: 60rpx;
 margin: 0 auto;
 padding: 10rpx 10rpx 10rpx 10rpx;
}
.voice_ing{
 width: 90%;
 height: 75rpx;
 line-height: 85rpx;
 text-align: center;
 border-radius: 15rpx;
 border: 1px solid #d0d0d0;
}
.sendmessage_2 { 
 z-index: 1;
 position: relative;
 width: 100%; 
 display: flex; 
 background-color: #F4F4F6; 
 flex-direction: row; 
 height: 85rpx;
}  
.sendmessage input { 
 width: 75%; 
 height: 60rpx;  
 background-color: white; 
 line-height: 60rpx; 
 font-size: 28rpx; 
 border-radius: 10rpx;
 margin-top: 10rpx;
 margin-left: 20rpx;
 border: 1px solid #d0d0d0; 
 padding-left: 20rpx; 
} 
.sendmessage button { 
 border: 1px solid white; 
 width: 18%; 
 height: 65rpx; 
 background: #00CC00;
 color: white;
 line-height: 65rpx; 
 margin-top: 10rpx;
 font-size: 28rpx; 
} 
 
.hei{ 
 height: 20rpx; 
} 
.history { 
 height: 80%; 
 padding: 20rpx 20rpx 20rpx 20rpx;
 font-size: 14px; 
 line-height: 50rpx; 
 word-break: break-all; 
} 
 
.icno_kf{
 position: fixed;
 bottom: 160rpx;
 margin: 0 auto;
 text-align: center;
 left: 50%;
 margin-left: -40rpx;
 width: 100rpx;
 height: 100rpx;
 border-radius: 50%
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript 学习笔记(十一)
Jan 19 Javascript
jquery方法+js一般方法+js面向对象方法实现拖拽效果
Aug 30 Javascript
js验证是否为数字的总结
Apr 14 Javascript
JSON中双引号的轮回使用过程中一定要小心
Mar 05 Javascript
JavaScript获取键盘按键的键码(参照表)
Jan 10 Javascript
jQuery 判断元素整理汇总
Feb 28 Javascript
JS实现字符串翻转的方法分析
Aug 31 Javascript
JQuery的加载和选择器用法简单示例
May 13 jQuery
解决IOS端微信H5页面软键盘弹起后页面下方留白的问题
Jun 05 Javascript
微信小程序 腾讯地图显示偏差问题解决
Jul 27 Javascript
用原生JS实现爱奇艺首页导航栏代码实例
Sep 19 Javascript
vue 使用localstorage实现面包屑的操作
Nov 16 Javascript
JavaScript实现的简单Tab点击切换功能示例
Jul 06 #Javascript
vue结合axios与后端进行ajax交互的方法
Jul 06 #Javascript
jQuery实现仿京东防抖动菜单效果示例
Jul 06 #jQuery
vue.js动画中的js钩子函数的实现
Jul 06 #Javascript
老生常谈JS中的继承及实现代码
Jul 06 #Javascript
vue.js使用v-if实现显示与隐藏功能示例
Jul 06 #Javascript
vue.js计算属性computed用法实例分析
Jul 06 #Javascript
You might like
一个连接两个不同MYSQL数据库的PHP程序
2006/10/09 PHP
谨慎使用PHP的引用原因分析
2012/09/06 PHP
PHP自定session保存路径及删除、注销与写入的方法
2014/11/18 PHP
php实现插入数组但不影响原有顺序的方法
2015/03/27 PHP
PHP自动生成表单代码分享
2015/06/19 PHP
怎样在JavaScript里写一个swing把数据插入数据库
2012/12/10 Javascript
js输出阴历、阳历、年份、月份、周示例代码
2014/01/29 Javascript
js返回上一页并刷新的多种实现方法
2014/02/26 Javascript
node.js中的buffer.copy方法使用说明
2014/12/14 Javascript
JS实现的车标图片提示效果代码
2015/10/10 Javascript
JavaScript+canvas实现七色板效果实例
2016/02/18 Javascript
js插件Jcrop自定义截取图片功能
2016/10/14 Javascript
jQuery实现表格元素动态创建功能
2017/01/09 Javascript
详解angularJS+Ionic移动端图片上传的解决办法
2017/09/13 Javascript
node打造微信个人号机器人的方法示例
2018/04/26 Javascript
Node.js之readline模块的使用详解
2019/03/25 Javascript
详解webpack4.x之搭建前端开发环境
2019/03/28 Javascript
状态机的概念和在Python下使用状态机的教程
2015/04/11 Python
Django框架下在视图中使用模版的方法
2015/07/16 Python
python实现发送和获取手机短信验证码
2016/01/15 Python
利用Python实现颜色色值转换的小工具
2016/10/27 Python
python使用pil进行图像处理(等比例压缩、裁剪)实例代码
2017/12/11 Python
对Python3之进程池与回调函数的实例详解
2019/01/22 Python
Python基础之字符串操作常用函数集合
2020/02/09 Python
python实现图片横向和纵向拼接
2020/03/05 Python
Python tkinter制作单机五子棋游戏
2020/09/14 Python
详解HTML5中download属性的应用
2015/08/06 HTML / CSS
安德玛菲律宾官网:Under Armour菲律宾
2020/07/28 全球购物
高一历史教学反思
2014/01/13 职场文书
面包店的创业计划书范文
2014/01/16 职场文书
公司办公室岗位职责
2014/03/19 职场文书
家长会欢迎标语
2014/06/24 职场文书
答谢词范文
2015/01/05 职场文书
大学感恩节活动总结
2015/05/05 职场文书
2019年自助餐厅创业计划书模板
2019/08/22 职场文书
Python学习之异常中的finally使用详解
2022/03/16 Python