muddesigner/MudEngine/Networking/Server.cs
Scionwest_cp 70533582a6 MudEngine:
- Player movement command now fully implemented. 
 - Game.GetRealm() added to retrieve a Realm within the games RealmCollection property
 - Game.End() added to perform game ending duties and shut down the Server
 - Server now loses opened threads.
 - Player.Move() added to move the player from Room to Room.
 - Room.DoorwayExist() tweaked to work with the new way Environments are managed.

MudGame:
 - Now executes the Look command on startup so the player can see where they are located at.
 - Implements the new Game.End() method and fixes the game hanging upon exit.
2010-07-25 18:33:21 -07:00

149 lines
No EOL
4.3 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using MudEngine.GameObjects.Characters;
/* Usage:
* Server MUDServer = new Server();
* MUDServer.InitializeUDP(666); or MUDServer.InitializeTCP(666);
* MUDServer.Start();
*/
namespace MudEngine.Networking
{
public class Server
{
public Server()
{
stage = 0;
server = new ServerSocket();
}
~Server()
{
stage = 0;
if (server.type == ProtocolType.Tcp)
{
for (int i = 0; i < numberOfClients; i++)
clients[i].CleanUp();
numberOfClients = 0;
}
server.CleanUp();
}
public bool InitializeTCP(int port, ref List<BaseCharacter> pbs)
{
if (stage != 0)
return false;
if (server.Initialize(port, ProtocolType.Tcp) < 0)
return false;
numberOfClients = pbs.Count;
clients = new ClientSocket[pbs.Count];
clientThreads = new Thread[pbs.Count];
players = pbs;
stage++;
return true;
}
public bool InitializeUDP(int port, ref List<BaseCharacter> pbs)
{
if (stage != 0)
return false;
if (server.Initialize(port, ProtocolType.Udp) < 0)
return false;
players = pbs;
stage++;
return true;
}
public bool Start()
{
if (stage != 1)
return false;
if (server.Start() < 0)
return false;
if (server.Bind() < 0)
return false;
if (server.type == ProtocolType.Tcp)
if (server.Listen() < 0)
return false;
stage++;
serverThread = new Thread(ServerThread);
serverThread.Start();
return true;
}
public void EndServer()
{
stage = 0;
serverThread.Abort();
if (server.type == ProtocolType.Tcp)
{
for (int i = 0; i < numberOfClients; i++)
clients[i].CleanUp();
numberOfClients = 0;
}
server.CleanUp();
}
/*
* ServerThread, if UDP: Accepts messages(ReceiveFrom) and sends in correspondence to the correct player
* if TCP: Accepts connection and opens a separate thread to receive a data stream between the clien
*/
private void ServerThread()
{
if (server.type == ProtocolType.Udp)
{
}
else
{
while (stage == 2)
{
int sub = -1;
do
{
for (int i = 0; i < numberOfClients; i++)
{
if (!clients[i].used)
{
sub = i;
break;
}
}
} while (sub == -1);
server.Accept(clients[sub]);
clients[sub].used = true;
players[sub].Initialize(ref clients[sub]);
ParameterizedThreadStart start = new ParameterizedThreadStart(ReceiveThread);
clientThreads[sub] = new Thread(start);
clientThreads[sub].Start();
}
}
}
private void ReceiveThread(object obj)
{
int sub = (int)obj;
while (stage == 2 && clients[sub].used)
{
byte[] buf = new byte[256];
clients[sub].Receive(buf);
}
}
private Thread serverThread;
private ServerSocket server;
private int stage;
List<BaseCharacter> players;
// TCP Stuff:
private ClientSocket[] clients;
private Thread[] clientThreads;
private int numberOfClients;
}
}