koa + websocket + vue实现简单的聊天

使用koa2.x  koa-websocket vue2.x

1.首先 用koa创建websocket服务

/* 实例化外部依赖 */
var Koa = require("koa");
var WebSocket = require("koa-websocket");
var app = WebSocket(new Koa());
var ctxs = []; //用来保存ctx对象 用以广播信息

// 开启 监听端口
app.listen(8080, () => {console.log('server is running at 8080')});


/* websoket把收到的信息转发给出了自己的所有客户端 */
app.ws.use((ctx, next) => {
    /* 每打开一个连接就往 上线文数组中 添加一个上下文 */
    ctxs.push(ctx);
    ctx.websocket.send("server connected")
    ctx.websocket.on("message", (message) => {
        for(let i = 0; i < ctxs.length; i++) {
            if (ctx != ctxs[i]) {
                ctxs[i].websocket.send(message)
            }
        }
    });
    
    // 客户端主动断开链接时候用 可以先不管
    ctx.websocket.on("close", (message) => {
        /* 连接关闭时, 清理 上下文数组, 防止报错 */
        let index = ctxs.indexOf(ctx);
        ctxs.splice(index, 1);
    });
});

2.编写客户端

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>webSocket</title>
    <script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
    <div id="app">
        <input type="text" v-model="inputV">
        <button @click="send">send</button>
        <ul>
            <li 
            v-for="item in messages" 
            :key="item + Math.random()">
                {{item}}
            </li>
        </ul>
    </div>
</body>
<script>
    var app = new Vue({
        el: '#app',
        data: {
            inputV: '',
            messages: [],
            webSocket: null
        },
        mounted() {
            var websocketURL = "ws://localhost:8080"
            /*websocket 兼容*/
            if(window.WebSocket) {
                this.webSocket = new WebSocket(websocketURL);
            } else {
                if(window.MozWebSocket) {
                    this.webSocket = new MozWebSocket(websocketURL)
                } else {
                    console.error("your browser is not support websocket!")
                    <!-- 不知道为什么 这里不能写return(报错) 求指教 -->
                    return
                }
            }
            
            /* 接收到服务端的消息时 */
            this.webSocket.onmessage =  (event) => {
                this.messages.push(event.data)
            };

            /* 关闭时 */
            this.webSocket.onclose = function () {
                console.log("关闭连接");
            };
        },
        methods: {
            send: function(){
                this.webSocket.send(this.inputV)
            }
        },
        
    })
</script>

</html>

工程化的Vue暂时还没写,这是在界面直接引入的vue,不知道在用脚手架创建项目的时候是不是一样的写法,欢迎指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值