NodeJs 【加强版】实现跨域WebSocket 即时通讯

原生WebSocket API使用起来不太方便,我们使用Socket.io,它很好地封装了webSocket接口,提供了更简单、灵活的接口,也对不支持webSocket的浏览器提供了向下兼容。

  • 服务端代码
  • 根据不同客户端传来的消息存储一下 不同的对象
  • 需要安装 npm i socket.io --save
  • 下载 socket.io.js
  • nodejs 代码
const socket = require("socket.io");
const http = require('http');

// 创建服务
const server = http.createServer((req,res)=>{
    // 允许所有跨域请求
    res.setHeader('Access-Control-Allow-Origin', '*');
    req.writeHead(200,{'Content-Type':'text/html'})
    res.end('')
}).listen(8001)

let pad = null,pc = null , padReady = false , pcReady = false;

// 连接socket.io
socket.listen(server).on('connection',(conn)=>{
    conn.on('message',(str)=>{
        if(str==="Pad"){
            pad = conn;
            padReady = true;
            conn.send('连接成功');
        }
        if(str==="PC"){
            pc = conn;
            pcReady = true;
        }

        if(padReady&&pcReady){
            if(str==='PC') str='我是PC界面'
            pc.send(str);
        }
    })

    conn.on("disconnection",(code, reason) => {
        console.log("关闭连接")
    });
})
  • pad.html 代码
<!doctype html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        .kuang {
            text-align: center;
            margin-top: 200px;
        }

        #mess {
            text-align: center
        }

        .value {
            width: 200px;
            height: 200px;
            border: 1px solid;
            text-align: center;
            line-height: 200px;
            display: inline-block;
        }
    </style>
</head>

<body>
    <div id="mess">正在连接...</div>
    <div class="kuang">
        <div class="value" id="value1">aaaaaaa</div>
        <div class="value" id="value2">bbbbbbb</div>
        <div class="value" id="value3">ccccccc</div>
    </div>
    <script src="./js/socket.io.js"></script>
    <script>
        // 跨域地址
        const socket = io('192.168.1.115:8001')

        socket.on('connect', () => {
            // 连接成功
            socket.send('Pad')
            // 监听连接
            socket.on('message', (msg) => {
                document.getElementById('mess').innerHTML=msg
                // console.log(msg)
            })
            // 关闭连接
            socket.on('disconnect', () => {

            })
        })

        document.querySelector(".kuang").onclick = (e)=> {
           socket.send(e.target.innerHTML);
        }
    </script>
</body>

</html>
  • pc.html 代码
<!doctype html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        .kuang {
            text-align: center;
            margin-top: 200px;
        }

        #mess {
            text-align: center
        }
    </style>
</head>

<body>
    <div id="mess"></div>
    <script src="./js/socket.io.js"></script>
    <script>
        var mess = document.getElementById("mess");
        // 跨域地址
        // TODO: 这里注意一下 不能写127.0.0.1 或者localhost 不然其他客户端访问不到
        const socket = io('192.168.1.115:8001')

        socket.on('connect', () => {
            // 连接成功
            socket.send('PC')
            // 监听连接
            socket.on('message', (msg) => {
                mess.innerHTML = msg
                // console.log(msg)
            })
            // 关闭连接
            socket.on('disconnect', () => {

            })
        })
    </script>
</body>

</html>

本文由博客一文多发平台 OpenWrite 发布!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值