Сервер, размещенный на бесплатной Dyno HEROKU, с бесплатной PSQL HEROKU.
Соединение с SocketIO с использованием экспресс:
const port: number = parseInt(process.env.PORT || process.env.GAMESERVER_PORT || "NaN", 10);
if (isNaN(port)) {
throw Error("Invalid GAMESERVER_PORT number");
}
const app = require('express')();
const server = require('http').Server(app);
export const io = require('socket.io')(server);
server.listen(port);
console.log('listening on', port);
When client is connected (using Unity SocketIO), it send thoses data : the firebase ID of the player.
Tools.GetSocket().On("connect", (E) =>
{
JSONObject data = new JSONObject();
data.AddField("fb_id", PlayerPrefs.GetString("password"));
Tools.GetSocket().Emit("auth:token", data);
});
Затем сервер обновляет socket_id учетной записи, связанной с этим идентификатором firebase..
socket.on('auth:token', async function (data: JSON) {
if (data['fb_id'] != '' && data['fb_id'] != null && !isUndefined(data['fb_id'])) {
let account: Account | null = await AccountRep.findOne({ fb_id: data["fb_id"] });
if (account != null) {
if (account.socket_id != null && account.socket_id != socket.id)
socket.to(account.socket_id).emit('kick');
if (account.socket_id != socket.id) account.socket_id = socket.id;
}
else socket.emit('err', { code: 'log:error', message: 'firebase ID is null' });
getConnection('Accounts').manager.save(account);
И все это работает хорошо до конца этого сценария: когда идентификатор сокета обновляется на нужной учетной записи, я затем отправляю обратно клиенту «Хорошо, у вас есть пользователь этого сервера, а ты автолог на этом сервере!»
в этой части после нескольких повторных подключений останавливается выполнение
let user_callisto: number = await getConnection('Callisto').manager.getRepository(User).createQueryBuilder('user')
.where('fb_id = :fbid', { fbid: account.fb_id})
.getCount();
let user_oberon: number = await getConnection('Oberon').manager.getRepository(User).createQueryBuilder('user')
.where('fb_id = :fbid', { fbid: account.fb_id })
.getCount();
class Servers {
callisto: boolean;
oberon: boolean;
code: string;
autoload: string;
pseudo: string;
}
let server: Servers = new Servers();
server.code = 'authentificated';
server.callisto = user_callisto != 0;
server.oberon = user_oberon != 0;
if (account.server_focus == 'oberon' && !server.oberon) account.server_focus = '';
if (account.server_focus == 'callisto' && !server.callisto) account.server_focus = '';
if (account.server_focus != 'oberon' && account.server_focus != 'callisto') account.server_focus = '';
server.autoload = account.server_focus;
socket.emit('logged', server);
И затем клиент получает уведомление о том, что он может запросить все данные с определенного сервера.
Tools.GetSocket().On("logged", (E) =>
{
SERVER servers = JsonUtility.FromJson<SERVER>(E.data.ToString());
if (servers.autoload != "")
{
JSONObject data = new JSONObject();
data.AddField("server", servers.autoload);
Tools.GetSocket().Emit("load:server", data);
}
});
И сервер отправит все необходимые данные с этого сервера на этот клиент.
Это работает хорошо, но если я закрою и создаю определенное количество соединений (около 10), токод останавливается: я все еще подключаюсь к сокету и отправляю информацию о FireBase ID.Сервер получает его, но останавливается, когда ему нужно выбрать пользователей из разных серверов.
Есть ли какая-то конкретная причина, почему это происходит?После этого мне нужно вручную перезапустить сервер, иначе никто не сможет снова подключиться, код всегда блокируется в той же части.