Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,6 @@ node_modules
trash
.DS_Store
*.sublime-*
yarn.lock
yarn.lock
.idea/
.vscode/

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

你叛变了

2 changes: 1 addition & 1 deletion Client.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ function Client (manager,socket) {
this.room = null;
this.cfg = null;
this.nickname = '';
this.id = Math.random();
this.id = getRandomString(); // length: 64
// this.ip = '';
this.onSocketUpdate = null;

Expand Down
10 changes: 10 additions & 0 deletions Game.js
Original file line number Diff line number Diff line change
Expand Up @@ -1124,4 +1124,14 @@ Game.prototype.getLiveMessagePacks = function () {
return this.hostPlayer.messagePacks;
};

Game.prototype.getMessagePacks = function(target) {
if (target === 'host') {
return this.hostPlayer.messagePacks;
} else if (target === 'guest') {
return this.guestPlayer.messagePacks;
} else {
return null;
}
};

global.Game = Game;
108 changes: 91 additions & 17 deletions RoomManager.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,38 +22,42 @@ function RoomManager (cfg) {
setInterval(this.cleanUp.bind(this),60*1000);
}

RoomManager.prototype.createClient = function (socket,id) {
RoomManager.prototype.createClient = function (socket,id,reconnect) {
if (this.clients.length >= this.MAX_CLIENTS) {
socket.disconnect();
return;
}

var client;
if (id) {
var room;
for (var i = 0; i < this.rooms.length; i++) {
room = this.rooms[i];
// if (!room.reconnecting) continue; // 服务器可能还不知道掉线,所以注释掉.
// console.log('host:%s\nguest:%s\nyou:%s',room.host.id,room.guest.id,id);
var room;
if (id && reconnect) {
// 在游戏中掉线的用户,updateSocket后即可恢复连接
if (this.checkInRoom(id)) {
room = this.getRoomByClientId(id);
if (room.host.id === id) {
client = room.host;
client.updateSocket(socket);
break;
}
if (room.guest && room.guest.id === id) {
} else {
client = room.guest;
client.updateSocket(socket);
break;
}
}
if (client) {
room.reconnecting = false;
socket.emit('game reconnect');
room.emit('opponent reconnect');
} else {
socket.emit('game reconnect failed');
}
}

if (id && !reconnect) {
// 掉线并刷新了浏览器的用户,不建立Client对象
// 首先,服务器发送重建对战需要的数据
this.sendReconnectContent(socket,id);
// 等待客户端重建现场,进行updateSocket
socket.on('updateSocket',this.updateSocket.bind(this,socket,id));
return;
}

if (!client) {
client = new Client(this,socket);
}
Expand All @@ -63,7 +67,15 @@ RoomManager.prototype.createClient = function (socket,id) {
// this.maxClientsCount = this.clients.length;
// console.log(new Date().toISOString().replace('T',' ').substr(0,19)+' Max clients count: %s',this.clients.length);
// }

this.bindSocketEvent(socket, client);
// socket.on('reloadCardInfo',this.reloadCardInfo.bind(this));

socket.emit('version',this.VERSION);
this.updateRoomList();
};

RoomManager.prototype.bindSocketEvent = function (socket, client) {
socket.on('error',this.handleError.bind(this,client));
socket.on('disconnect',this.disconnect.bind(this,client));
socket.on('createRoom',this.createRoom.bind(this,client));
Expand All @@ -83,12 +95,74 @@ RoomManager.prototype.createClient = function (socket,id) {
socket.on('surrender',client.surrender.bind(client));
socket.on('drop',client.drop.bind(client));
socket.on('tick',client.tick.bind(client));
}

// socket.on('reloadCardInfo',this.reloadCardInfo.bind(this));
RoomManager.prototype.checkInRoom = function (id) {
var room;
for (var i = 0; i < this.rooms.length; i++) {
room = this.rooms[i];
if ((room.host.id === id) || (room.guest && room.guest.id === id)) {
return true;
}
}
return false;
}

socket.emit('version',this.VERSION);
this.updateRoomList();
};
RoomManager.prototype.getRoomByClientId = function (id) {
var room;
for (var i = 0; i < this.rooms.length; i++) {
room = this.rooms[i];
if ((room.host.id === id) || (room.guest.id === id)) {
return room;
}
}
return null;
}

RoomManager.prototype.sendReconnectContent = function (socket, id) {
// 发送该玩家的游戏录像,等待客户端恢复对战
var room;
var position;
if (this.checkInRoom(id)) {
room = this.getRoomByClientId(id);
if (room.host.id === id) {
position = 'host';
} else {
position = 'guest';
}
socket.emit('reconnectContent', {
'position': position,
'messagePacks': room.game.getMessagePacks(position)
});
} else {
socket.emit('game reconnect failed');
}
}

RoomManager.prototype.updateSocket = function (socket, id) {
// 获知客户端恢复对战现场后,updateSocket
var room;
var client;
if (this.checkInRoom(id)) {
room = this.getRoomByClientId(id);
if (room.host.id === id) {
client = room.host;
} else {
client = room.guest;
}
client.updateSocket(socket);
this.bindSocketEvent(socket,client);
this.clients.push(client);

client.emit('tock');
client.emit('version',this.VERSION);

room.reconnecting = false;
room.emit('opponent reconnect');
} else {
client.emit('game reconnect failed');
}
}

RoomManager.prototype.handleError = function (client,err) {
console.error(err);
Expand Down
19 changes: 17 additions & 2 deletions test.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,21 @@
'use strict';

// return hex string of a random 256bit number
global.getRandomString = function () {
if (global.window) {
var array = new Uint32Array(8);
window.crypto.getRandomValues(array);
return array.reduce(function(str, num){
console.log(num.toString(16).length)
return str+('0000000' + num.toString(16)).slice(-8);
}, '')
} else {
var crypto = require('crypto');
var numString = crypto.randomBytes(32).toString('hex');
return ('0'.repeat(63) + numString).slice(-64);
}
}

if (!global.window) {
global.Random = require("random-js");
require("./util.js");
Expand Down Expand Up @@ -157,8 +173,7 @@ io.on('connect',function (socket) {
var query = require('url').parse(req.url,true).query;
// console.log('connect: %s, count: %s',req.connection.remoteAddress,getSocketCount());
// console.log(query.clientId);
roomManager.createClient(socket,+query.clientId);

roomManager.createClient(socket,query.clientId,query.reconnect);
// test
// socket.on('force disconnect',function () {
// socket.disconnect();
Expand Down
2 changes: 1 addition & 1 deletion webxoss-client
Submodule webxoss-client updated 2 files
+64 −5 RoomManager.js
+0 −1 index.html