- only TCP, works has been tested - Commented out Lists and replaced with arrays, the way the list was working it wouldn't have worked, if you can figure out how to make it work feel free to fix it up. - TODO: When user types exit, the game object becomes useless, I need a Reset function of some kind to reset it for when a new player comes in to reuse that player object. - TODO: Encryption - TODO: Fix main person so they have admin commands like list, restart instead of a game with the main server. (ATM Just like that for testing, but now you can test with telnet client)
130 lines
No EOL
3.7 KiB
C#
130 lines
No EOL
3.7 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;
|
|
port = 0;
|
|
server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
|
|
}
|
|
~Server()
|
|
{
|
|
stage = 0;
|
|
port = 0;
|
|
}
|
|
public bool Initialize(int p, ref /*List<BaseCharacter>*/BaseCharacter[] pbs)
|
|
{
|
|
if (stage != 0)
|
|
return false;
|
|
if (p <= 0)
|
|
return false;
|
|
port = p;
|
|
clientThreads = new Thread[pbs./*Capacity*/Length];
|
|
players = pbs;
|
|
stage++;
|
|
return true;
|
|
}
|
|
public bool Start()
|
|
{
|
|
try
|
|
{
|
|
if (stage != 1)
|
|
return false;
|
|
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, port);
|
|
server.Bind(ipep);
|
|
server.Listen(10);
|
|
stage++;
|
|
serverThread = new Thread(ServerThread);
|
|
serverThread.Start();
|
|
}
|
|
catch (Exception)
|
|
{
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
public void EndServer()
|
|
{
|
|
stage = 0;
|
|
serverThread.Abort();
|
|
server.Close();
|
|
}
|
|
private void ServerThread()
|
|
{
|
|
while (stage == 2)
|
|
{
|
|
int sub = -1;
|
|
do
|
|
{
|
|
for (int i = 0; i < players./*Count*/Length; i++)
|
|
{
|
|
if (!players[i].IsActive)
|
|
{
|
|
sub = i;
|
|
break;
|
|
}
|
|
}
|
|
} while (sub < 0);
|
|
players[sub].client = server.Accept();
|
|
players[sub].Initialize();
|
|
//ParameterizedThreadStart start = new ParameterizedThreadStart(ReceiveThread);
|
|
clientThreads[sub] = new Thread(ReceiveThread);
|
|
clientThreads[sub].Start((object)sub);
|
|
}
|
|
}
|
|
private void ReceiveThread(object obj)
|
|
{
|
|
int sub = (int)obj;
|
|
while (stage == 2 && players[sub].IsActive)
|
|
{
|
|
try
|
|
{
|
|
byte[] buf = new byte[255];
|
|
int recved = players[sub].client.Receive(buf);
|
|
if(recved > 0)
|
|
players[sub].Receive(buf);
|
|
}
|
|
catch (Exception) // error receiving, close player
|
|
{
|
|
players[sub].Clear();
|
|
}
|
|
}
|
|
}
|
|
public void Disconnect(int sub)
|
|
{
|
|
if (sub > 0 && sub < players./*Capacity*/Length)
|
|
{
|
|
clientThreads[sub].Abort();
|
|
players[sub].Clear();
|
|
}
|
|
}
|
|
|
|
private Thread serverThread;
|
|
private Socket server;
|
|
private int stage;
|
|
private int port;
|
|
|
|
//List<BaseCharacter> players;
|
|
BaseCharacter[] players;
|
|
|
|
// TCP Stuff:
|
|
private Thread[] clientThreads;
|
|
}
|
|
} |