Nodejs + WebSocket + Vue 实现多人聊天室- 第二章,阿里中间件

29 阅读2分钟

var ws = require("nodejs-websocket");

// 这里用到了moment,请大家自行安装

var moment = require('moment');

console.log("开始建立连接...")

let users = [];

// 向所有连接的客户端广播

function boardcast(obj) {

server.connections.forEach(function(conn) {

conn.sendText(JSON.stringify(obj));

})

}

function getDate(){

return moment().format('YYYY-MM-DD HH:mm:ss')

}

var server = ws.createServer(function(conn){

conn.on("text", function (obj) {

obj = JSON.parse(obj);

if(obj.type===1){

users.push({

nickname: obj.nickname,

uid: obj.uid

});

boardcast({

type: 1,

date: getDate(),

msg: obj.nickname+'加入聊天室',

users: users,

uid: obj.uid,

nickname: obj.nickname

});

} else {

boardcast({

type: 2,

date: getDate(),

msg: obj.msg,

uid: obj.uid,

nickname: obj.nickname

});

}

})

conn.on("close", function (code, reason) {

console.log("关闭连接")

});

conn.on("error", function (code, reason) {

console.log("异常关闭")

});

}).listen(8001)

console.log("WebSocket建立完毕")

这里和《 WebSocket简绍- 第一章》大体结构相同,不同的是,这里向客户端发送消息是用的一个方法

server.connections.forEach(function(conn) {

conn.sendText(JSON.stringify(obj));

})

遍历所有连接,发送信息。

这里为什么要JSON.stringify(obj)转换成字符串???

那是sendText方法只能传入字符串,所以我们需要将我们的对象转换一下。

同时,大家应该可以看出,在conn.on("text", ()=>{})的时候判断了一个从客户端传入的type,这个操作是判断用户是否是第一次进入。

WebSocket客户端视图层

<c-dialog

ref="loginDialog"

title='请输入你的昵称'

confirmBtn="开始聊天"

@confirm="login"

聊天室

在这里插入图片描述

样式方面就不做解释了,都是非常简单的样式,有兴趣的可以点击最下方获取源码查看。

WebSocket客户端

export default {

data(){

return {

uid: '',

nickname: '',

socket: '',

msg: '',

messageList: []

}

},

mounted() {

let vm = this;

let user = localStorage.getItem('WEB_IM_USER');

user = user && JSON.parse(user) || {};

vm.uid = user.uid;

vm.nickname = user.nickname;

if(!vm.uid){

vm.$refs.loginDialog.show()

} else {

vm.conWebSocket();

}

document.onkeydown = function (event) {

var e = event || window.event;

if (e && e.keyCode == 13) { //回车键的键值为13

vm.send()

}

}

},

methods: {

send(){

if(!this.msg){

return

}

this.sendMessage(2, this.msg)

},

sendMessage(type, msg){

this.socket.send(JSON.stringify({

uid: this.uid,

type: type,

nickname: this.nickname,

msg: msg

}));

this.msg = '';

},

conWebSocket(){

let vm = this;

if(window.WebSocket){

vm.socket = new WebSocket('ws://localhost:8001');

let socket = vm.socket;

socket.onopen = function(e){

console.log("连接服务器成功");

if(!vm.uid){

// 生成新的用户id,并存入localStorage

vm.uid = 'web_im_' + moment().valueOf();

localStorage.setItem('WEB_IM_USER', JSON.stringify({

uid: vm.uid,

nickname: vm.nickname

}))

vm.sendMessage(1)

}

}

socket.onclose = function(e){

console.log("服务器关闭");

}

socket.onerror = function(){

console.log("连接出错");

}

// 接收服务器的消息

socket.onmessage = function(e){

let message = JSON.parse(e.data);

vm.messageList.push(message);

最后

前端CSS面试题文档,JavaScript面试题文档,Vue面试题文档,大厂面试题文档

开源分享:docs.qq.com/doc/DSmRnRG…