|
@@ -1,80 +1,86 @@
|
|
|
-var fs = require('fs')
|
|
|
-var http = require('http')
|
|
|
-var socketIO = require('socket.io')
|
|
|
-var express = require("express");
|
|
|
-var path = require("path");
|
|
|
+var server = require("http").createServer();
|
|
|
+module.exports = class WebSocketServer {
|
|
|
+ constructor() {
|
|
|
+ this._pageMap = new Map();
|
|
|
+ this._roomIDS = new Map();
|
|
|
+ this._roomPerson = new Map()
|
|
|
|
|
|
+ this._users = [];
|
|
|
|
|
|
-var app = express();
|
|
|
-app.use(express.static(path.join(__dirname, '/'))); //设置 express static 静态文件
|
|
|
+ }
|
|
|
|
|
|
-app.get("/chat", (req, res) => {
|
|
|
- fs.readFile("./client.html", (err, data) => {
|
|
|
- if (err) throw err;
|
|
|
- res.write(data);
|
|
|
- res.end();
|
|
|
- })
|
|
|
-})
|
|
|
+ create() {
|
|
|
+ this.io = require("socket.io")(server, {
|
|
|
+ path: "/vr-node",
|
|
|
+ serveClient: false,
|
|
|
+ // below are engine.IO options
|
|
|
+ pingInterval: 10000,
|
|
|
+ pingTimeout: 5000,
|
|
|
+ cookie: false,
|
|
|
+ });
|
|
|
+
|
|
|
+ server.listen(3000, { origins: "*" });
|
|
|
|
|
|
-var server = http.createServer(app);
|
|
|
+ this.io.on("connection", (socket) => {
|
|
|
+ let user = socket.handshake.query
|
|
|
+ this._users.push(user)
|
|
|
+ const roomId = user['roomId']
|
|
|
+ const client_room = `${roomId}_client`
|
|
|
+ let roomsPerson = this._roomPerson.get(roomId) || []
|
|
|
+ socket.join(client_room);
|
|
|
+ // 一个房间只允许存在一个场景码
|
|
|
+ if (!user['isClient'] && roomsPerson.filter(item => item.scene_num !== user.scene_num).length === 0) {
|
|
|
+ socket.join(roomId, () => {
|
|
|
+ roomsPerson.push(user)
|
|
|
+ this._roomPerson.set(roomId, roomsPerson)
|
|
|
+ // 只派发非小程序端的socket连接数及其user数据
|
|
|
+ console.log(user.scene_num, user.role)
|
|
|
+ this.io.to(roomId).emit('vr_request', { persons: roomsPerson.filter(item => !item.isClient) });
|
|
|
+ this.io.to(client_room).emit('vr_request', { persons: roomsPerson.filter(item => !item.isClient) });
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ socket.on('startCall', () => {
|
|
|
+ socket.broadcast.to(roomId).emit('answer', { user })
|
|
|
+ socket.broadcast.to(client_room).emit('answer', { user })
|
|
|
+ })
|
|
|
|
|
|
-var users = {};// sid socket
|
|
|
-var reflect = {};// name sid
|
|
|
-var io = socketIO.listen(server);
|
|
|
-io.on('connection', function (socket) {
|
|
|
- console.log(socket.id + "已经连接完成")
|
|
|
- // console.log(socket.id+"已经连接完成")
|
|
|
- //每次连接都对应一个 sid
|
|
|
- //每一个用户都有一个socket 对应一个 sid 对应一个 username
|
|
|
- // console.log(socket.id);
|
|
|
- io.sockets.emit('connectSucc', socket.id);
|
|
|
+ socket.on('stopCall', () => {
|
|
|
+ socket.broadcast.to(roomId).emit('putup', { user })
|
|
|
+ socket.broadcast.to(client_room).emit('putup', { user })
|
|
|
+ })
|
|
|
|
|
|
- //
|
|
|
- //发送私密消息
|
|
|
- socket.on('private message', function (from, to, msg) {
|
|
|
- // from -->sid
|
|
|
- //to -->sid
|
|
|
- for (const key in reflect) {
|
|
|
- console.log(key, ":", reflect[key])
|
|
|
+
|
|
|
+
|
|
|
+ socket.on("getJson", (data) => {
|
|
|
+ if (roomId) {
|
|
|
+ this.io.to(roomId).emit("action", data.content.action);
|
|
|
+ this.io.to(roomId).emit("vr_response", data);
|
|
|
}
|
|
|
- // console.log('I received a private message by ', reflect[from],from, ' say to ', reflect[to],to, msg);
|
|
|
- if (reflect[to] in users) {
|
|
|
- // console.log('to :' + to);
|
|
|
- //to 222
|
|
|
- // users[reflect[to]].emit('to' + to, { mess: msg });
|
|
|
- users[reflect[to]].emit('to' + to, { person: from, content: msg });
|
|
|
- console.log('to' + to);
|
|
|
- console.log(reflect[to]);
|
|
|
- //
|
|
|
- // console.log(reflect[to],to+'_to');
|
|
|
- // xor <--> 222
|
|
|
+ });
|
|
|
+
|
|
|
+ socket.on("disconnect", (reason) => {
|
|
|
+ let roomsPerson = this._roomPerson.get(roomId) || []
|
|
|
+ // 断开连接的把roomsPerson中的user去掉
|
|
|
+ roomsPerson = roomsPerson.filter(item => item !== user)
|
|
|
+ this._roomPerson.set(roomId, roomsPerson)
|
|
|
+ if (!user.isClient) {
|
|
|
+ this.io.to(roomId).emit('vr_request', { persons: roomsPerson.filter(item => !item.isClient) });
|
|
|
+ this.io.to(client_room).emit('vr_request', { persons: roomsPerson.filter(item => !item.isClient) });
|
|
|
}
|
|
|
- });
|
|
|
+ });
|
|
|
+ socket.on("error", function (reason) {
|
|
|
+ console.log("异常关闭", reason)
|
|
|
+ });
|
|
|
+ return this;
|
|
|
|
|
|
- //新增用户
|
|
|
- socket.on('new user', function (data) {
|
|
|
- reflect[data] = socket.id;
|
|
|
- // var sidList =
|
|
|
- //data 是 from 谁发的 添加到这个 users列表 登陆的用户
|
|
|
+ })
|
|
|
|
|
|
- if (socket.id in users) {
|
|
|
- socket.emit("userHasLogin");
|
|
|
- } else {
|
|
|
- // var nickname = data;
|
|
|
- users[socket.id] = socket;
|
|
|
- console.log(data, socket.id, "已经登录!")
|
|
|
- // users["aaa"] = socket
|
|
|
- //每一个登陆的用户有一个自己的socket
|
|
|
- }
|
|
|
- // console.info(users);
|
|
|
- });
|
|
|
- //断开连接
|
|
|
- socket.on('disconnect', function () {
|
|
|
- console.log('user' + socket.id + ' disconnected');
|
|
|
- });
|
|
|
-});
|
|
|
+ }
|
|
|
|
|
|
+ close() {
|
|
|
+ this.server.disconnect(true);
|
|
|
+ }
|
|
|
|
|
|
-server.listen(8080, function () {
|
|
|
- console.log('Listening at: http://localhost:8080');
|
|
|
-});
|
|
|
+};
|