110 lines
3.1 KiB
JavaScript
110 lines
3.1 KiB
JavaScript
var WebSocketServer = require('ws').Server,
|
|
ws = new WebSocketServer({ port: 3000 });
|
|
|
|
// 群的数据结构
|
|
// 10086: [
|
|
// {
|
|
// userName: '刘兵',
|
|
// userAuthor: 'http://1.com/1.jpg',
|
|
// roomNumber: 10086,
|
|
// userSocket: "WebSocket",
|
|
// type: 1 ,// 1 群主 2 管理员 3 群成员
|
|
// }
|
|
// ]
|
|
|
|
var groundList = { }
|
|
|
|
ws.on('connection', function (io, req) {
|
|
console.log('前端简历链接....');
|
|
|
|
io.on('message', function (message) {
|
|
var text = JSON.parse(message.toString());
|
|
switch (text.type) {
|
|
case "SocketHealthy":
|
|
send(io,{ type: 'SocketHealthy', data: "pong" })
|
|
break;
|
|
case "SocketUser":
|
|
console.log("用户消息:", text)
|
|
switch (text.action) {
|
|
case "send":
|
|
SendAllExceptTheSender(text.data)
|
|
break;
|
|
case "userList":
|
|
SendAll(text.data, {
|
|
type: "SocketUser",
|
|
action: 'list',
|
|
data: groundList[text.data.room]
|
|
})
|
|
break;
|
|
}
|
|
// send(io,{ type: 'SocketUser', data: "这是SocketUser的测试消息" })
|
|
break;
|
|
case "SocketSystem":
|
|
console.log("系统消息:", text)
|
|
switch (text.action) {
|
|
case "join":
|
|
joinUser(io,text.data)
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
});
|
|
});
|
|
|
|
function joinUser(io,info) {
|
|
console.log("用户加群:", info);
|
|
// 如果已经有这个群了
|
|
if (groundList.hasOwnProperty(info.room)) {
|
|
console.log("已经有这个群了")
|
|
groundList[info.room].push({
|
|
userName: info.name,
|
|
userAuthor: info.img,
|
|
roomNumber: info.room,
|
|
userSocket: io,
|
|
type: 3
|
|
})
|
|
// 没有这个群
|
|
} else {
|
|
console.log("没有这个群")
|
|
groundList[info.room] = [];
|
|
groundList[info.room].push({
|
|
userName: info.name,
|
|
userAuthor: info.img,
|
|
roomNumber: info.room,
|
|
userSocket: io,
|
|
type: 1
|
|
});
|
|
}
|
|
|
|
SendAll(info, {
|
|
type: 'SocketSystem',
|
|
action: 'joinMessage',
|
|
data: `欢迎用户 ${info.name} 加入群聊!`
|
|
})
|
|
console.log(groundList)
|
|
}
|
|
|
|
function SendAll(info, message) {
|
|
var currentUserGround = groundList[info.room];
|
|
currentUserGround.forEach(v => {
|
|
v.userSocket.send(JSON.stringify(message))
|
|
})
|
|
}
|
|
|
|
// 向群内所有人推送消息,但是排除消息发送者自己
|
|
function SendAllExceptTheSender(info) {
|
|
var currentUserGround = groundList[info.room];
|
|
currentUserGround.forEach(v => {
|
|
if (info.name != v.userName) {
|
|
v.userSocket.send(JSON.stringify({
|
|
type: 'SocketUser',
|
|
action: 'to',
|
|
data: info
|
|
}))
|
|
}
|
|
})
|
|
}
|
|
|
|
function send(socket,data) {
|
|
socket.send(JSON.stringify(data));
|
|
} |