Click here to Skip to main content
11,578,954 members (66,752 online)
Click here to Skip to main content
Add your own
alternative version

Protocol implementation

, 31 Jan 2005 26.1K 150 24
Add some protocol support to your server.
using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Text;
using System.IO;
using System.Collections;

namespace Infinity.Networking
{
	/// <summary>
	/// Summary description for ClientThread.
	/// </summary>
	public class ClientConnection : IDisposable	
	{
		private const int BUFFERSIZE = 1024;

		private bool _disposed;
		private Socket _clientSocket;
		private Thread _thread;
		private MultiThreadedServerBase _server;

		protected Socket Socket
		{
			get
			{
				return _clientSocket;
			}
		}

		public Thread Thread
		{
			get
			{
				return _thread;
			}
		}

		public ClientConnection(Socket clientSocket , MultiThreadedServerBase server)
		{
			_server = server;
			_disposed = false;
			_clientSocket = clientSocket;

			_thread = new Thread(new ThreadStart(Recieve));

			// start the thread.
			try
			{
				_thread.Start();
			}
			catch(ThreadAbortException abortException)
			{
				Console.WriteLine((string)abortException.ExceptionState);
			}
		}

		~ClientConnection()
		{
			if (!_disposed)
				Dispose();
		}

		internal void Recieve()
		{
			byte[] buffer = new byte[BUFFERSIZE];

			try
			{
				_clientSocket.Receive(buffer,0,buffer.Length,SocketFlags.None);
			}
			catch (SocketException se)
			{
				switch(se.ErrorCode)
				{
					case (int)SocketErrorCodes.ConnectionAborted :
						Dispose();
						break;

					case (int)SocketErrorCodes.ConnectionResetByPeer :
						Dispose();
						break;

					// this is thrown when i need to stop
					// if the server go's down.
					case (int)SocketErrorCodes.InterruptedFunctionCall:
						break;
				}
				return;
			}

			HandleCommand(buffer);
			buffer = null;
		}

		// if i recieved something then it should be handled.
		private void HandleCommand(byte[] data)
		{
			string rxData = Encoding.Default.GetString(data);
			string command = rxData.Trim('\0').Split(' ')[0];

			// check if i got a function for this command
			if (_server.MessageHandlers.Contains(command))
			{

				((NetworkMessageHandler)_server.MessageHandlers[command])
					.DynamicInvoke(new object[]{this,rxData});
			}
			// if not i'll just continue to recieve and do nothing.
			else if (command != "")
			{
				Recieve();
			}
		}

		private string GetString(byte[] data)
		{
			return Encoding.Default.GetString(data);
		}

		public void Dispose()
		{
			if (!_disposed)
			{
				_disposed = true;

				_clientSocket.Close();
				_clientSocket = null;

				_thread.Abort();
				_thread = null;
			}
			else
			{
				new ObjectDisposedException("connection has alraydy been disposed");
			}
		}
	}
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

Share

About the Author

engine252
Belgium Belgium
No Biography provided

You may also be interested in...

| Advertise | Privacy | Terms of Use | Mobile
Web04 | 2.8.150603.1 | Last Updated 31 Jan 2005
Article Copyright 2005 by engine252
Everything else Copyright © CodeProject, 1999-2015
Layout: fixed | fluid