1、建立webscoket.js:

import Vue from 'vue'
import { Message } from 'element-ui'
let v = new Vue()
v.$message = Message;
var webSocket = null;
var isConnect = false; //连接状态
var globalCallback = function (e) { console.log(e) };//定义外部接收数据的回调函数
var reConnectNum = 0;//重连次数
const url = new URL(location.href)
let type = url.searchParams.get('type') ? url.searchParams.get('type') : sessionStorage.getItem('type')
let userId = url.searchParams.get('userId') ? url.searchParams.get('userId') : sessionStorage.getItem('userId')
if (process.env.NODE_ENV == "development"){
    var websocketUrl = `ws://10.8.0.66:8093/websocket/${userId}/${type}`;
}else{
    var websocketUrl = `ws://36.112.128.108:8080/ws/${userId}/${type}`;
}
//心跳设置
var heartCheck = {
    heart: {
        type: '1',
        content: 'heart',
        sendId: userId
    },//心跳包
    timeout: 60 * 1000, //每段时间发送一次心跳包 这里设置为60s
    heartbeat: null, //延时发送消息对象(启动心跳新建这个对象,收到消息后重置对象)
    start: function () {
        this.heartbeat = setInterval(() => {
            if (isConnect) {
                webSocketSend(this.heart);
            } else {
                this.clear();
            }
        }, this.timeout);
    },
    reset: function () {
        clearInterval(this.heartbeat);
        this.start();
    },
    clear: function () {
        clearInterval(this.heartbeat);
    }
}
//初始化websocket
function initWebSocket(callback) {
    //此callback为在其他地方调用时定义的接收socket数据的函数
    if (callback) {
        if (typeof callback == 'function') {
            globalCallback = callback
        } else {
            throw new Error("callback is not a function")
        }
    }
    if ("WebSocket" in window) {
        webSocket = new WebSocket(websocketUrl);//创建socket对象
    } else {
        Message({
            message: '该浏览器不支持websocket!',
            type: 'warning'
        });
        return
    }
    //打开
    webSocket.onopen = function () {
        webSocketOpen();
    };
    //收信
    webSocket.onmessage = function (e) {
        webSocketOnMessage(e);
    };
    //关闭
    webSocket.onclose = function (e) {
        webSocketOnClose(e);
    };
    //连接发生错误的回调方法
    webSocket.onerror = function (e) {
        webSocketonError(e);
    };
}
//连接socket建立时触发
function webSocketOpen() {
    console.log("WebSocket连接成功");
    //首次握手
    if (type == '1'){
        webSocketSend(heartCheck.heart);
    }else{
    }
    isConnect = true;
    heartCheck.start();
    reConnectNum = 0;
}
//客户端接收服务端数据时触发,e为接受的数据对象
function webSocketOnMessage(e) {
    console.log("websocket信息:", e);
    console.log(e.data)
    if (e.data == "stopUser") {
        Message({
            message: '你已被上级管理员停用即将跳转登录页',
            type: 'warning'
        });
        setTimeout(() => {
            window.location.href = vueConfig.jqUrl + "vue/web/login"
        }, 3000);
    }
    // const data = JSON.parse(e.data);//根据自己的需要对接收到的数据进行格式化
    globalCallback(e.data);//将data传给在外定义的接收数据的函数,至关重要。
}
//socket关闭时触发
function webSocketOnClose(e) {
    heartCheck.clear();
    isConnect = false; //断开后修改标识
    console.log(e)
    console.log('webSocket已经关闭 (code:' + e.code + ')')
    //被动断开,重新连接
    if (e.code == 1001 || e.code == 1006) {
        if (reConnectNum < 3) {
            initWebSocket();
            ++reConnectNum;
        }else {
            v.$message({
                message: 'websocket连接不上,请刷新页面或联系开发人员!',
                type: 'warning'
            });
        }
    }
}
//连接发生错误的回调方法
function webSocketonError(e) {
    heartCheck.clear();
    isConnect = false; //断开后修改标识
    console.log("WebSocket连接发生错误:");
    console.log(e);
}
//发送数据
function webSocketSend(data) {
    webSocket.send(JSON.stringify(data));//在这里根据自己的需要转换数据格式
}
//在其他需要socket地方主动关闭socket
function closeWebSocket(e) {
    webSocket.close();
    heartCheck.clear();
    isConnect = false;
    reConnectNum = 0;
}
//在其他需要socket地方接受数据
function getSock(callback) {
    globalCallback = callback
}
//在其他需要socket地方调用的函数,用来发送数据及接受数据
function sendSock(agentData) {
    //下面的判断主要是考虑到socket连接可能中断或者其他的因素,可以重新发送此条消息。
    switch (webSocket.readyState) {
        //CONNECTING:值为0,表示正在连接。
        case webSocket.CONNECTING:
            setTimeout(function () {
                sendSock(agentData, callback);
            }, 1000);
            break;
        //OPEN:值为1,表示连接成功,可以通信了。
        case webSocket.OPEN:
            webSocketSend(agentData);
            break;
        //CLOSING:值为2,表示连接正在关闭。
        case webSocket.CLOSING:
            setTimeout(function () {
                sendSock(agentData, callback);
            }, 1000);
            break;
        //CLOSED:值为3,表示连接已经关闭,或者打开连接失败。
        case webSocket.CLOSED:
            // do something
            break;
        default:
            // this never happens
            break;
    }
}
export default {
    initWebSocket,
    closeWebSocket,
    sendSock,
    getSock,
    webSocketSend
};
 
2、main函数中引入并挂载:
import webscoketApi from './utils/websoket'
Vue.prototype.$socketApi = webscoketApi
 
3、初始化webscoket:

this.$socketApi.initWebSocket(this.getsocketResult)
 
4、接收信息:
// socket信息返回接受函数
        getsocketResult(data) {
            this.$socketApi.getSock(this.getScoketMes)
        },
        getScoketMes(data){
    if(sessionStorage.getItem('type') == '1'){  
                if (JSON.parse(data).type == '4') { //二号位反馈一号位
                    this.showWinTan = 1
                    this.showWinTanTitle = '任务完成'
                   
                } else if (JSON.parse(data).type == '5' && sessionStorage.getItem('userId') == '3') { //组长消息提示
                    this.$notify({
                        title: '消息通知',
                        duration: 0,
                        message: JSON.parse(data).content,
                        // position: 'bottom-right'
                    });
                } else if (JSON.parse(data).type == '6') { //小程序反馈
                    this.$notify({
                        title: '消息通知',
                        duration: 0,
                        message: JSON.parse(data).content,
                        // position: 'bottom-right'
                    });
                }
            } else if (sessionStorage.getItem('type') == '2'){  //二号位
                JSON.parse(data).type == '2' ? this.acceptFileShow = true : ''
                if (JSON.parse(data).content != 'heart'){
                    sessionStorage.statusAllId = JSON.parse(data).id
                    this.statusAllId = JSON.parse(data).id
                }
                this.sendId = JSON.parse(data).sendId
                this.toUserId = JSON.parse(data).toUserId
                this.content = JSON.parse(data).content
                if (JSON.parse(data).type == '7') { //催办  二号位接收
                    this.$notify({
                        title: '消息通知',
                        duration: 0,
                        message: JSON.parse(data).content,
                        // position: 'bottom-right'
                    });
                }
            }
        },
 
5、发送消息:
   this.$socketApi.sendSock({
                type: '7',
                sendId: sessionStorage.getItem('userId'),
                content: '来自于一号位的关于' + val.task_name + '的催办',
                toUserId: '2',
                sendSystemTag: sessionStorage.getItem('type'),
                toSystemTag: '2',
            })

v2即时通讯的应用的更多相关文章

  1. 可在广域网部署运行的即时通讯系统 -- GGTalk总览(附源码下载)

      (最新版本:V6.2,2019.01.03 .Xamarin移动端版本已经推出,包括 Android 和 iOS) GGTalk开源即时通讯系统(简称GG)是QQ的高仿版,同时支持局域网和广域网, ...

  2. 【转】可在广域网部署运行的即时通讯系统 -- GGTalk总览(附源码下载)

    原文地址:http://www.cnblogs.com/justnow/p/3382160.html (最新版本:V6.0,2017.12.11 .即将推出Xamarin移动端版本,包括 Androi ...

  3. 利用WCF双工模式实现即时通讯

    概述 WCF陆陆续续也用过多次,但每次都是浅尝辄止,以将够解决问题为王道,这几天稍闲,特寻了些资料看,昨晚尝试使用WCF的双工模式实现了一个简单的即时通讯程序,通过服务端转发实现客户端之间的通讯.这只 ...

  4. android环境下的即时通讯

    首先了解一下即时通信的概念.通过消息通道 传输消息对象,一个账号发往另外一账号,只要账号在线,可以即时获取到消息,这就是最简单的即使通讯.消息通道可由TCP/IP UDP实现.通俗讲就是把一个人要发送 ...

  5. 【原创】轻量级即时通讯技术MobileIMSDK:Android客户端开发指南

    申明:MobileIMSDK 目前为个人维护的原创开源工程,现陆续整理了一些资料,希望对需要的人有用.如需与作者交流,见文章底签名处,互相学习. MobileIMSDK开源工程的代码托管地址请进入 G ...

  6. 【原创】轻量级移动设备即时通讯技术MobileIMSDK的常见问题解答

    申明:MobileIMSDK 目前为个人原创开源工程且已发布,现整理了一些有关MobileIMSDK的常见的问题,希望对需要的人有用,谢谢.如需与作者交流,见文章底部个人签名处,互相学习. Mobil ...

  7. 【原创】轻量级移动端即时通讯技术 MobileIMSDK 发布了

    申明:MobileIMSDK目前为个人原创开源工程,投入了大量的时间和精力,希望对需要的人有所帮助.如需与作者交流,见文章底部个人签名处,互相学习.Q群:215891622,欢迎共同志趣者学习和交流. ...

  8. ActiveMQ 即时通讯服务 浅析

      一. 概述与介绍 ActiveMQ 是Apache出品,最流行的.功能强大的即时通讯和集成模式的开源服务器.ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provi ...

  9. APP邂逅即时通讯云,让你的手机APP聊起来

     #推荐活动# #线下沙龙# 明天下午在IC咖啡 —— <APP邂逅即时通讯云,让你的手机APP聊起来>, http://url.cn/Y8sYo5 

  10. 岁末年初3Q大战惊现高潮,360震撼推出Android "3Q" IM即时通讯

    岁末年初3Q大战惊现高潮,360震撼推出Android "3Q" IM即时通讯 看过了QQ和360斗争的开端高潮,当然现在还不能说这场斗争已经结束,在我看来这次的事件未尝不是一个适 ...

随机推荐

  1. vector 用法2

    vector 是向量类型,它可以容纳许多类型的数据,如若干个整数,所以称其为容器.vector 是C++ STL的一个重要成员,使用它时需要包含头文件: 复制代码 代码如下: #include< ...

  2. redux-thunk初步使用

    redux中间件,用来处理异步action 返回 一个函数  内部函数接收存储方法dispatch和getState参数 demo: import { GET_ONLINE_STATUS, SET_O ...

  3. HTTP相关知识学习

    五层网络模型 应用层 包括HTTP,FTP... HTTP支持客户/服务器模式 简单快速有getpost方法 灵活,可以传输任意类型 无连接,每次连接只处理一个请求,收到应答就关闭 无状态,对于事物处 ...

  4. git-开发常用命令

    1.本地克隆代码 git clone http地址 2.查看所有分支 git branch -a remotes/origin开头 :远程分支 3.切换分支 git checkout 分支名 4.删除 ...

  5. 项目实训DAY 11-12 学习

    在神经网络可视化工具中,选择了三种,NNSVG,PlotNeuralNet,GraphCore 前两者应该比较好实现,例子都跑通了,对于定制的代码读起来也不难.PNN的示例图如下 最后一个虽然有实例图 ...

  6. React++antd+ProComponents可编辑表格EditableProTable组件实现表单中的可编辑列表组件

    需求: 在新增&编辑表单中,共分三个表单模块,第二个模块设计为一个可编辑表格组件,其中可选下拉列表依赖外层第一个模块的某条数据值,提供新增.编辑.删除.按规定条件去重等功能,并在第三个模块中自 ...

  7. python3 文件上传

    1 # 文件上传方法 2 def upload_files(filepath, url, headers, data): 3 filename = filepath.split('\\')[-1] 4 ...

  8. vue项目安装淘宝镜像一直失败,解决办法

    这个问题纠缠了我好几天,刚开始把npm,node卸载了重装,发现还是一样的问题,最后发现是权限不够,下面这个方法完美解决 失败原因:没有用管理员权限执行, 解决办法:找到安装nodejs安装的路径,再 ...

  9. sar与ksar使用显示监控数据

    一.Ksar: 1)下载ksar地址:https://github.com/vlsi/ksar/releases/tag/v5.2.4-snapshot.10-gf068072 2)启动:java - ...

  10. 云服务器搭建redis主从复制以及哨兵模式(附踩坑记录)

    云服务器搭建redis主从复制以及哨兵模式(附踩坑记录) 踩坑记录见最后 搭建一主两从: 在根目录下任意新建一个目录/myredis来存放配置文件: 将我们常用的redis.conf文件拷贝到该目录下 ...