websocket

websocket

websocket依赖于http协议的第一次握手,然后多了个Upgrade: websocket进行协议升级,返回的也是websocket,
为什么要用websocket因为http必须要客户端请求才会发数据,轮询的方式又太浪费了。

一.事件

		open,loose,erro,message,回调onopen,onloose,onerro,onmessage,

二.js原生的

((doc)=>{
    const list = doc.querySelector('#list')
    const message = doc.querySelector('#message')
    const send = doc.querySelector('#send')
    const ws = new WebSocket('ws:/localhost:8000')  //创建一个websocket对象
    let username = ''
    const init=()=>{
        bindEvent()
    }
    function bindEvent(){
        send.addEventListener('click',handGo,false)
        ws.addEventListener('open',handOpne,false)    //添加4个事件
        ws.addEventListener('close',handClose,false)
        ws.addEventListener('message',handMessage,false)
        ws.addEventListener('erro',handErro,false)

    }
    function handGo(){
        console.log('发送信息');
        const msv = message.value
        ws.send(JSON.stringify(
            {
                username,
                data:new Date().getTime(),
                massage:msv
            }
        ))  //send发送给服务器
    }
    function handOpne(){
        console.log('open');
        username  = sessionStorage.getItem('username')
    }
    function handErro(){
        console.log('erro');
    }
    function handClose(){
        console.log('close');
    }
    function handMessage(e){
        console.log('message');
        const meg = JSON.parse(e.data) //message拿到服务器发回来的数据
    }
    init()
})(document)

三.VUE方法
1.首先init一个websocket,http用wshttps用wss

data(){
    websocketObj: null,
    wsHeartflag: false,
    reconnectTime: 0
},
created(){
    this.initWebsocket(); //创建组件的时候调用这个init
},
methods: {
    initWebsocket(){
        if (websocket in window) {
            this.webSocketObj = new WebSocket(
                "wss://"+newApi+"/websocket?sid="+userToken
            ); //创建一个websocket对象
            this.webSocketObj.onmessage = this.onMessage //保存他的4个方法
            this.webSocketObj.onopen = this.onOpen
            this.webSocketObj.onerror = this.onError
            this.webSocketObj.onclose = this.onClose
        }  
    }
}

2.写上对应websocket方法

onOpen() {
    if (this.webSocketObj.readyState === 1) {
        //- readyState 等于1 的时候建立链接成功
        this.wsHeartflag = true;
        this.webSocketObj.send("13123123");
        this.reconnectTime = 0;
    }
},
timingHeart() {
    // 心跳检测  每4.5分钟发送一次 
    if (this.wsHeartflag) {
        this.webSocketObj.send('123123123'); //send发送给服务器
    }
    this.wsHeart = setTimeout(() => {
        this.timingHeart();
    }, 100 * 1000); // 100s心跳
},
onMessage(evt) {
    var received_msg = evt && JSON.parse(evt.data);
    if (received_msg.code === '1') {
        // 支付成功
        // this.$toast('恭喜您,支付成功,已升级成VIP');
        this.onClose();
    } else {
        // 支付失败
        this.showSuccessPop = false;
    }
},
onError() {
    // 链接失败,进行重连
    clearTimeout(this.wsHeart);
    this.wsHeartflag = false;
    if (this.reconnectTime <= MAX_CONNECT) {
        setTimeout(() => {
            this.onOpen();
            this.reconnectTime+=1;
        }, 5000);
    } else {
        this.$toast('抱歉,暂时无法连接到聊天服务器,请稍后再试');
        this.onClose();
    }
},
onClose() {
    this.wsHeartflag = false;
    this.webSocketObj && this.webSocketObj.close && this.webSocketObj.close();
},
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值