zoukankan      html  css  js  c++  java
  • websocket聊天室

    实现效果如下:

    websocket最大的遍历性是服务器可以向客户端推送消息。

    现在能实现websockt的库很多,我选择了socket.io,今天找空闲看来下socket.io的文档,动手实现了下(服务端用node实现);

    浏览器端代码:

            window.onload=function(){
                let sock=io.connect('ws://localhost:3000/');
                let oEl=document.querySelector('.prompt');
                
                // 连接
                sock.on('connect',()=>{
                    oEl.style.display='none';
                })
                // 断开连接
                sock.on('disconnect',()=>{
                    oEl.style.display='block';
                })
                
                // 发送消息
                let eUl=document.querySelector('.message_box');
                let eBtn=document.querySelector('.send_btn');
                let eText=document.querySelector('.text_box');
                eBtn.addEventListener('click',function(){
                    sock.emit('message',eText.value);
                    let eLi=document.createElement('li');
                    eLi.innerHTML=eText.value;
                    eLi.className='me';
                    eUl.appendChild(eLi);
                    eText.value='';     
                })
    
                // 接受消息
                sock.on('message',(data)=>{
                    let eLi=document.createElement('li');
                    eLi.innerHTML=data;
                    eUl.appendChild(eLi);
                })
            }

    服务端代码:

    const http=require('http');
    const io=require('socket.io');
    
    let httpServer=http.createServer((req,res)=>{});
    httpServer.listen(3000);
    
    let wsServer=io.listen(httpServer);
    let aSocket=[];
    wsServer.on('connection',socket=>{
        aSocket.push(socket);
        
        // 断开连接
        socket.on('disconnect',()=>{
            // 使用连接时的cocket
            let index=aSocket.indexOf(socket);
            if(index!=-1){
                aSocket.splice(index,1);
            }
        })
        // 接受
        socket.on('message',(data)=>{
            // 发送
            aSocket.forEach(item=>{
                if(item!=socket){
                    item.emit('message',data);
                }
            })
        })
    })

    开发中的总结:

    1.c端的链接是connect,而s端的链接用的是connection

    2.c端和s端都是用on监听,用emit发送消息

    3.为了实现一对多的分发,需要在服务端把链接的实例socket存在一个数据组中,同时把断开连接的实例移除

  • 相关阅读:
    【转】将项目打成war包并用tomcat部署的方法,步骤及注意点
    JETTY+NGINX
    【转】收集 jetty、tomcat、jboss、weblogic 的比较
    SQL左右连接中的on and和on where的区别
    定义一个servlet用于处理所有外部接口类 架构思路
    spring上下文快速获取方法
    jasper打印实例2 ----通过文件字节流获得PDF格式图片
    Jasper打印示例
    Jasperreport5.6.9-----1
    Linux装B命令
  • 原文地址:https://www.cnblogs.com/maoBable/p/11157232.html
Copyright © 2011-2022 走看看