未做私聊功能。
協議要求,onopen 的時候發送:
ws.send(JSON.stringify({ data: { room: "RoomName", nick: "Nick", icon: "Icon" }, type: "join" }));
然后就進入了 RoomName 聊天室。
const WS = require("ws").Server;
var chat = new ChatRoom;
new WS({ port: 8080 }).on("connection", ws => {
var user = new ChatUser(ws);
ws.on("message", res => user.onMsg(res));
ws.on("close", res => user.exit(res));
ws.on("error", err => console.log(err));
});
console.log("WebSocket 服務偵聽于埠 8080");
function ChatRoom() {
this.join = (user, roomName) => {
let room = rooms[roomName] || { name: roomName, id: 0, users: new Object, count: 0 };
if(!room.id) rooms[roomName] = room;
user.id = ++room.id; room.count++;
user.room = room;
room.users[user.id] = user;
return user.id;
};
this.kick = user => {
if(!user.room) return;
let room = user.room;
room.count--;
delete user.room;
delete room.users[user.id];
if(room.count) return;
delete rooms[ room.name ];
console.log(`房間 ${room.name} 被銷毀`);
};
var rooms = new Object;
}
function ChatUser(ws) {
this.onMsg = res => {
try{ res = JSON.parse(res); }
catch(err) { console.log("資料格式例外:" + res); }
if(res.type == "join") return this.doJoin(res.data);
this.sendAll(res);
};
this.send = msg => {
if(ws.readyState != 1) return console.log("暫時無法發送", ws.readyState);
ws.send(JSON.stringify(msg));
};
this.sendAll = msg => {
var room = this.room; if(!room) return;
for(var x in room.users) room.users[x].send(msg);
};
this.exit = () => ws.readyState != 3 ? ws.close() : chat.kick(this);
this.doJoin = data => {
data.id = chat.join(this, data.room);
this.send({ type: "join", data: data.id });
this.sendAll({ type: "welcome", data });
};
}
uj5u.com熱心網友回復:
謝謝分享,回頭測驗一下。uj5u.com熱心網友回復:

是不是需要安裝依賴包?
第一行報錯?
uj5u.com熱心網友回復:
npm install ws;轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/245466.html
標籤:JavaScript
