All pastes #20053 Raw Edit

Unnamed

public text v1 · immutable
#20053 ·published 2005-08-15 11:12 UTC
rendered paste body
using System;
using System.Data;
using System.Collections;
using System.Net;
using System.Net.Sockets;
using System.ServiceProcess;
using System.Threading;

namespace TCBChatServer
{

	public class ChatEngine
	{

		private ArrayList clients = new ArrayList(); // a list of all connected clients

		internal TcpListener server; // the server
		
		public ChatEngine(int port)
		{
			StartChatServer(port);
		}
		
		// Starts the server and listens for connections
		//	port is the Port number the server should listen to for connections.
		private void  StartChatServer(int port)
		{
			LogActivity("Attempting to Start Server");
			
			try
			{
				foreach(IPAddress d in Dns.Resolve(Dns.GetHostName()).AddressList)
				{
					Console.WriteLine("SERVER IP: " + d.ToString());
				}

				// create a new server 
				IPAddress serverip = Dns.GetHostByName(Dns.GetHostName()).AddressList[1];
				TcpListener temp_tcplistener = new  TcpListener(serverip, port);
				temp_tcplistener.Start();
				server = temp_tcplistener;

				LogActivity("Server Started on Port: " + port);

				
				while (true)
				{
					// listen for new client connections
					TcpClient socket = server.AcceptTcpClient();
					ChatClient client = new ChatClient(this, socket);
					LogActivity(client.Username + " connected to the server.");

					// add the new client to our client list 
					clients.Add(client);
				
					// start the client thread
					client.Start();
				}
			}
			catch
			{
				LogActivity("Server Error ... Stopping Server");

				// kill this server
				KillServer();
			}
		}
		
		// broadcasts a message to all connected clients
		public virtual void SendAllUsersMessage(System.String message)
		{
			lock(this)
			{
				// add the null character to the message
				message += '\x0000';
				
				foreach(ChatClient c in clients)
				{	
					try
					{
						c.SendUserMessage(message);
					}
					catch
					{
						Disconnect(c);
					}
				}
			}
		}

		public virtual void  Disconnect(ChatClient client)
		{
			string username = client.Username;

			LogActivity(username + " has left the server.");


			clients.Remove(client);

			SendAllUsersMessage("<S>" + username + " left.</S>");
			SendClientCount();
		}

		public virtual void SendClientCount()
		{
			Console.WriteLine("sendclientcount: " + clients.Count);
			SendAllUsersMessage("<N>" + clients.Count + "</N>");
		}

		
		// prints out a record of 'activity'
		public virtual void  LogActivity(String activity)
		{
			Console.Out.Write("[" + DateTime.Now.ToString("dd:MM:yyyy hh:mm:ss") +  "] " + activity + "\n");
		}
		
		// stops the server
		private void  KillServer()
		{
			try
			{
				// --- stop the server
				server.Stop();
				LogActivity("Server Stopped");
			}
			catch
			{
				LogActivity("Error while stopping Server");
			}
		}
		
		// initialiser.  it's run using ChatEngine.exe 8080 where 8080 is the port
		public static void  Main(String[] args)
		{
			int port = 0;
			if(args.Length < 1)
			{
				port = 8080;
			}
			else
			{
				try
				{
					port = Int32.Parse(args[0]);
				}
				catch
				{
					port = 8080;
				}
			}

			// if correct number of arguments
			ChatEngine server = new ChatEngine(port);
		}
	}
}