-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathGameServerMain.js
115 lines (93 loc) · 3.38 KB
/
GameServerMain.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
//Port Settings
const DEFAULT_HTTP_PORT = 8000;
const DEFAULT_TCP_PORT = 6000;
const DEFAULT_UDP_PORT = 5000;
//Time Definitions
var MILLISECONDS_BEFORE_CLIENT_TIMES_OUT = 5000;
var MILLISECONDS_IN_SECOND = 1000;
//Includes
var datagramPackage = require( 'dgram' );
var Vector = require( 'collection' ).Vector;
//-----------------------------------------------------------------------------------------------
function Client( ipAddress, portNumber )
{
this.ipAddress = ipAddress;
this.port = portNumber;
this.timeLastReceivedPacket = 0;
}
//+++++++++++++++++++++++++++++++++++++++ Keep Alive ++++++++++++++++++++++++++++++++++++++++++++
var clientList = new Vector();
function BroadcastMessageToAllClients( message )
{
for( var i = 0; i < clientList.size(); ++i )
{
var client = clientList.get( i );
udpSocket.send( message, 0, message.length, client.port, client.ipAddress );
}
}
//-----------------------------------------------------------------------------------------------
function HandleUDPMessage( receivedMessage, messageSender )
{
console.log('Received UDP Packet from ' + messageSender.address + ':' + messageSender.port + '.' );
var sendingClient = null;
for( var i = 0; i < clientList.size(); ++i )
{
var currentClient = clientList.get( i );
if( currentClient.ipAddress === messageSender.address && currentClient.port === messageSender.port )
{
currentClient.timeLastReceivedPacket = Date.now();
sendingClient = currentClient;
break;
}
}
if( sendingClient == null )
{
var newClient = new Client( messageSender.address, messageSender.port );
newClient.timeLastReceivedPacket = Date.now();
clientList.add( newClient );
}
BroadcastMessageToAllClients( receivedMessage );
}
//-----------------------------------------------------------------------------------------------
function PrintClientInfo( client, vectorModifier )
{
console.log( '\tClient ' + vectorModifier.index() + ' - @' + client.ipAddress + ':' + client.port );
}
//-----------------------------------------------------------------------------------------------
function PrintClientList()
{
if( clientList.isEmpty() )
{
console.log( 'No clients connected.' );
}
else
{
console.log( 'Client List:' );
clientList.each( PrintClientInfo );
}
setTimeout( PrintClientList, 5000 );
}
//-----------------------------------------------------------------------------------------------
function RemoveClientIfTimedOut( client, vectorModifier )
{
var timeNow = Date.now();
if( timeNow - client.timeLastReceivedPacket > MILLISECONDS_BEFORE_CLIENT_TIMES_OUT )
{
vectorModifier.remove(); //Remove this client
console.log( 'Removed client @' + client.ipAddress + ':' + client.port + ' due to ' +
( MILLISECONDS_BEFORE_CLIENT_TIMES_OUT / MILLISECONDS_IN_SECOND ) + ' seconds of inactivity.' )
}
}
//-----------------------------------------------------------------------------------------------
function RemoveTimedOutClients()
{
clientList.each( RemoveClientIfTimedOut );
setTimeout( RemoveTimedOutClients, 1000 );
}
//++++++++++++++++++++++++++++++++++++++++++ Main +++++++++++++++++++++++++++++++++++++++++++++++
var udpSocket = datagramPackage.createSocket( 'udp4' );
udpSocket.bind( DEFAULT_UDP_PORT );
udpSocket.on( 'message', HandleUDPMessage );
console.log( "UDP server now listening on port " + DEFAULT_UDP_PORT + "..." );
setTimeout( PrintClientList, 5000 );
setTimeout( RemoveTimedOutClients, 1000 );