socket.js

使用指南

简介说明


使用此socket.js插件,可以查看github 上的 useSocket.js 实例。全局连接一个 websocket,可通过声明时一键管理数据,当然你也可以自己随处管理数据。使用简单,只需要新建一个 js 专门管理 socket 即可。包括自动重连,手动重连,随处监听 等等。


注意事项


传输数据方面使用 json 转成 string 后传递,因为 socket 监听到数据变化后统一合并到一个指定对象下,怎么区分呢?建议在传递数据的时候,一个独立的页面统一使用一个对象包着。这样的话就可以在数据中区分出来了查看使用 vuex 管理数据。使用方面直接使用计算属性获取当前 vuex 下对应想要的数据,渲染到页面中就 ok 了。如果不喜欢通过 vuex 全局管理数据,想通过自定义事件监听完成查看使用自定义事件监听。还有的同学说使用websocket后,数据更新的时候页面会闪烁。建议不要在数据变化后反复调用 uni 的原生接口。


后台数据传输示例

  1. //server发送给chat页面数据
  2. chartPage:{
  3. selfName: "老司机"
  4. text: "连接成功了"
  5. time: "下午2:45:34"
  6. type: "self"
  7. }
  8. //server发送给index页面数据
  9. indexPage:{
  10. list:['xxx.png','xxxx2.png'],
  11. type:'images'
  12. }
  13. //vuex 数据将会变成这样
  14. SocketState:{
  15. chartPage:[
  16. {
  17. selfName:"老司机"
  18. text:"连接成功了"
  19. time:"下午3:14:46"
  20. type:"self"
  21. }
  22. ],
  23. indexPage:[
  24. {
  25. list:['xxx.png','xxxx2.png'],
  26. type:'images'
  27. }
  28. ]
  29. }
  30. //在chat页面使用chartPage中的数据
  31. import {mapState} from 'vuex';
  32. export default {
  33. data() {
  34. return {
  35. chartPage:[],
  36. }
  37. },
  38. computed: {
  39. ...mapState(['SocketState'])
  40. },
  41. watch: {
  42. 'SocketState.chartPage': function(val) {
  43. this.chartPage = val;
  44. }
  45. },
  46. }

使用自定义事件监听数据示例

  1. import Vue from 'vue'
  2. import store from "./store.js"; //引入vuex,路径换成自己的 重要
  3. import socket from "./socket.js"; //引入socket.js,路径换成自己的 重要
  4. const Socket =new socket({
  5. url: 'ws://192.168.0.29:9999/', //连接地址 必填
  6. })
  7. Socket.eventPatch.onOpen((msg,sk)=>{ //监听是否连接成功
  8. console.log('连接成功')
  9. });
  10. Socket.eventPatch.onMsg((msg,sk)=>{ //监听是否接受消息
  11. console.log(msg)
  12. });
  13. Socket.eventPatch.onClose((err,sk)=>{ //监听是否关闭连接
  14. console.log('关闭了连接')
  15. });
  16. Socket.eventPatch.onError((err,sk)=>{ //监听是否发生了错误
  17. console.log('连接出错')
  18. });
  19. Socket.eventPatch.onReload((res,sk)=>{ //监听是否重连成功
  20. console.log('重载:' + res)
  21. });
  22. Socket.eventPatch.onRdFinsh((count,sk)=>{ //监听最大重连次数是否已完成
  23. console.log('最大重连次数已完成' + count)
  24. });
  25. //以下演示在全局监听
  26. Vue.prototype.$Socket = Socket;
  27. //xxx.vue
  28. this.$Socket.eventPatch.onOpen((msg,sk)=>{ //监听是否连接成功
  29. console.log('连接成功')
  30. });
  31. this.$Socket.eventPatch.onMsg((msg,sk)=>{ //监听是否接受消息
  32. console.log(msg)
  33. });
  34. this.$Socket.eventPatch.onClose((err,sk)=>{ //监听是否关闭连接
  35. console.log('关闭了连接')
  36. });
  37. this.$Socket.eventPatch.onError((err,sk)=>{ //监听是否发生了错误
  38. console.log('连接出错')
  39. });
  40. this.$Socket.eventPatch.onReload((res,sk)=>{ //监听是否重连成功
  41. console.log('重载:' + res)
  42. });
  43. this.$Socket.eventPatch.onRdFinsh((count,sk)=>{ //监听最大重连次数是否已完成
  44. console.log('最大重连次数已完成' + count)
  45. });

使用自定义事件监听需要注意注入顺序,因为自定义事件必须等待实例完成返回后才能注册事件。所以在使用自定义事件后无法监听监听第一次的 onOpen 事件,此时你需要在初始化时传入 onOpen 方法即可


全局使用
新建 useSocket.js
  1. import Vue from 'vue'
  2. import store from "./store.js"; //引入vuex,路径换成自己的 重要
  3. import socket from "./socket.js"; //引入socket.js,路径换成自己的 重要
  4. const Socket =new socket({
  5. url: 'ws://192.168.0.29:9999/', //连接地址 必填
  6. onOpen(res) {
  7. console.log('连接成功')
  8. },
  9. onClose(err) {
  10. console.log('关闭了连接')
  11. },
  12. onReload(res) {
  13. console.log('重载:' + res)
  14. },
  15. onMsg(msg) {
  16. console.log(msg)
  17. }
  18. })
  19. Vue.prototype.$Socket = Socket; //连接成功挂在到原型上
store.js
  1. //store.js
  2. import Vue from 'vue'
  3. import Vuex from 'vuex'
  4. Vue.use(Vuex);
  5. const store = new Vuex.Store({
  6. state: {
  7. SocketState: {},
  8. SocketStateErr: {},
  9. },
  10. mutations: {
  11. setSocketState(that, info) {
  12. that.SocketState = info
  13. },
  14. setSocketStateErr(that, info) {
  15. that.SocketStateErr = info;
  16. }
  17. }
  18. })
  19. export default store;
main.js
  1. //main.js
  2. import Vue from 'vue'
  3. import App from './App'
  4. Vue.config.productionTip = false;
  5. import'./common/chat/useSocket.js'; //路径换成自己的
  6. import store from "./common/chat/store.js"; //路径换成自己的
  7. Vue.prototype.$store = store;
  8. App.mpType = 'app';
  9. const app = new Vue({
  10. ...App,
  11. store
  12. })
  13. app.$mount()
xxxxx.vue
  1. //xxxxx.vue
  2. this.$Socket.nsend('我是测试的哦') //放射一个数据到服务器
  3. this.$Socket.nclose(); //关闭webSocket连接
  4. this.$Socket.nrconnect(); //关闭连接并重新连接

代码演示

1.简单使用
  1. import socket from "./socket.js"; //引入socket.js 重要
  2. const Socket = new socket({
  3. url: 'ws://192.168.0.29:9999/', //连接地址 必填
  4. })
  5. Socket.nsend('发一个请求给服务端');
2.监听是否连接成功
  1. import socket from "./socket.js"; //引入socket.js 重要
  2. const Socket = new socket({
  3. url: 'ws://192.168.0.29:9999/', //连接地址 必填
  4. onOpen(res) {
  5. console.log('哦!连接成功啦');
  6. this.nsend('发一个请求给服务端');
  7. },
  8. })
3.监听是否断开连接
  1. import socket from "./socket.js"; //引入socket.js 重要
  2. const Socket = new socket({
  3. url: 'ws://192.168.0.29:9999/', //连接地址 必填
  4. onClose(err) {
  5. console.log('啊,关闭了连接')
  6. },
  7. })
  8. Socket.nclose();
3.监听数据传递
  1. import socket from "./socket.js"; //引入socket.js 重要
  2. const Socket = new socket({
  3. url: 'ws://192.168.0.29:9999/', //连接地址 必填
  4. onMsg(msg) {
  5. console.log(msg);
  6. }
  7. })
  8. Socket.nsend('发一个请求给服务端');
4.监听重新连接事件
  1. import socket from "./socket.js"; //引入socket.js 重要
  2. const Socket = new socket({
  3. url: 'ws://192.168.0.29:9999/', //连接地址 必填
  4. onReload(res) {
  5. console.log('重载:' + res)
  6. }
  7. })
  8. Socket.nrconnect();
5.监听发生错误事件
  1. import socket from "./socket.js"; //引入socket.js 重要
  2. const Socket = new socket({
  3. url: 'ws://192.168.0.29:9999/', //连接地址 必填
  4. onError(err) {
  5. console.log('哎呀发生了错误'+err)
  6. }
  7. })
  8. Socket.nsend('发一个请求给服务端');
6.监听最大重连次数是否完成
  1. import socket from "./socket.js"; //引入socket.js 重要
  2. const Socket = new socket({
  3. url: 'ws://192.168.0.29:9999/', //连接地址 必填
  4. onRdFinsh(count) {
  5. console.log(count+'次重连已完成')
  6. }
  7. })
  8. Socket.nsend('发一个请求给服务端');
7.设置断线后自动重连次数
  1. import socket from "./socket.js"; //引入socket.js 重要
  2. const Socket = new socket({
  3. url: 'ws://192.168.0.29:9999/', //连接地址 必填
  4. maxInterValCount:50,
  5. })
  6. Socket.nsend('发一个请求给服务端');
8.自定义参数
  1. import socket from "./socket.js"; //引入socket.js 重要
  2. const Socket = new socket({
  3. url: 'ws://192.168.0.29:9999/', //连接地址 必填
  4. header: {
  5. 'content-type': 'application/json'
  6. },
  7. method: 'GET'
  8. })
  9. Socket.nsend('发一个请求给服务端');

new socket 实例返回说明


通过实例化 new socket(Object) 会返回一个 SocketTask,可以通过这个实例来完成发送信息、关闭连接、重连、等一系列操作……此对象不需要等待,连接成功后才能发送消息。即 new 即生效 官网详细


new socket 参数 Object

属性名类型必填描述平台差异说明
urlString连接服务器接口地址小程序中必须是 wss:// 协议
maxInterValCountNumber最大尝试连接次数默认值是10 次
interValTimeNumber重连间隔时间默认值是2s
onOpenFunction监听当前连接是否成功。
onMsgFunction监听服务端发送过来的数据。
onCloseFunction监听此次连接是否断开。
onErrorFunction监听当前连接发送错误。
onReloadFunction监听使用 Socket.nrconnect() 方法重连是否成功。
onRdFinshFunction监听最大重连次数是否完成。
[…args]Object其他 uni-app 连接 WebSocket 时支持的任何参数详细详细请看 uni-app 官网

SocketTask 返回值

属性名返回值描述
url当前连接服务器接口地址
eventPatch实例自定义事件
InterValCount断开连接后重试的次数
extra通过new socket 传递的 [..args] 参数
isconnect是否处于链接状态
maxInterValCount最大尝试连接次数
uniColse是否通过 nclose() 方法正常关闭连接的
onClose()errObject监听此次连接是否断开
onError()errObject监听此次连接是否出现异常
onMsg()msgText监听服务端发送过来的数据
onOpen()object监听此次连接是否打开,握手成功
onReload()Boolean监听使用 nrconnect() 重连是否成功,连接成功返回 true,相反返回 false
onRdFinsh()Number监听最大重连次数是否完成。
nclose()主动断开连接
nsend()发送给服务端的数据
nrconnect()断开当前连接重新重试新的连接

eventPatch 自定义事件 详细使用

方法名描述
onOpen监听当前连接是否成功。
onMsg监听服务端发送过来的数据。
onClose监听此次连接是否断开。
onError监听当前连接发送错误。
onReload监听使用 Socket.nrconnect() 方法重连是否成功。
onRdFinsh监听最大重连次数是否完成。

回调方法及自定义事件参数返回说明


推荐使用普通函数,如果使用箭头函数 this 将会丢失 如果想在不想使用返回参数来调用方法则建议使用普通函数,普通函数将会包含当前上下文。关于参数返回则是统一返回两次参数,第一个为事件对应数据,第二个为SocketTask实例


普通函数和箭头函数的区别

  1. //普通函数
  2. const Socket = new socket({
  3. url: 'ws://192.168.0.29:9999/', //连接地址 必填
  4. onOpen (res) {
  5. let msg = {
  6. type: 'self',
  7. selfName: '老司机',
  8. text: '连接成功了',
  9. time: new Date().toLocaleTimeString()
  10. };
  11. this.nsend(JSON.stringify(msg)); //可以通过this访问到当前方法
  12. },
  13. })
  14. //箭头函数
  15. const Socket = new socket({
  16. url: 'ws://192.168.0.29:9999/', //连接地址 必填
  17. onOpen:(res,sk) =>{
  18. let msg = {
  19. type: 'self',
  20. selfName: '老司机',
  21. text: '连接成功了',
  22. time: new Date().toLocaleTimeString()
  23. };
  24. sk.nsend(JSON.stringify(msg)); //只能通过传递过来的实例对象
  25. Socket.nsend(JSON.stringify(msg)); //或者这样
  26. },
  27. })

以上两种方式是等价的 看自己的爱好或者情况选择即可