Advertisement
Guest User

Untitled

a guest
Jan 25th, 2015
205
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 10.63 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading;
  6. using System.Threading.Tasks;
  7. using System.Net;
  8. using System.Net.Sockets;
  9.  
  10. namespace UniProject.Core.ClientServer
  11. {
  12.     /// <summary>
  13.     /// Synchronous Server. Taken from MSDN. Source http://msdn.microsoft.com/en-us/library/6y0e13d3%28v=vs.110%29.aspx
  14.     /// This class was taken and edited by me, adding a class constructor, and custom event calls were added for the purpose of multi-treading
  15.     /// </summary>
  16.     public class Server
  17.     {
  18.         private int m_Port;
  19.         private int m_MaxConnections;
  20.         private string m_Host;
  21.         private Thread m_ClientCheckThread;
  22.         private Thread m_ListenerThread;
  23.         private bool m_Listen = true;
  24.  
  25.         // Incoming data from the client.
  26.         public Socket Socket;
  27.         public Socket Listener;
  28.         public List<ClientHandler> Clients;
  29.  
  30.         public delegate void ClientConnectedHandler(ClientHandler client);
  31.         public delegate void ClientDisconnectedHandler(ClientHandler client);
  32.         public delegate void DataReceivedHandler(ClientHandler client, CustomEventArgs.DataEventArgs e);
  33.            
  34.         public event DataReceivedHandler DataReceived;
  35.         public event ClientConnectedHandler ClientConnected;
  36.         public event ClientDisconnectedHandler ClientDisconnected;
  37.         public int Port
  38.         {
  39.             get
  40.             {
  41.                 return m_Port;
  42.             }
  43.         }
  44.  
  45.         public string Host
  46.         {
  47.             get
  48.             {
  49.                 return m_Host;
  50.             }
  51.         }
  52.  
  53.         public int MaxConnections
  54.         {
  55.             get
  56.             {
  57.                 return m_MaxConnections;
  58.             }
  59.         }
  60.  
  61.         public bool IsAlive
  62.         {
  63.             get { return m_ListenerThread.IsAlive; }
  64.         }
  65.  
  66.  
  67.         public Server(string host = "127.0.0.1", int port = 100, int maxConnections = 100)
  68.         {
  69.             this.m_Port = port;
  70.             this.m_Host = host;
  71.             this.m_MaxConnections = maxConnections;
  72.             this.Clients = new List<ClientHandler>();
  73.             //m_ClientCheckThread = new Thread(CheckClients);
  74.             m_ListenerThread = new Thread(StartListening);
  75.             //m_ClientCheckThread.Start();
  76.             m_ListenerThread.Start();
  77.         }
  78.  
  79.         public void StartListening()
  80.         {
  81.             // Establish the local endpoint for the socket.
  82.             IPAddress ipAddress = IPAddress.Parse(this.m_Host);
  83.             IPEndPoint localEndPoint = new IPEndPoint(ipAddress, this.m_Port);
  84.  
  85.             // Create a TCP/IP socket.
  86.             Listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  87.  
  88.             // Bind the socket to the local endpoint and listen for incoming connections.
  89.             Listener.Bind(localEndPoint);
  90.             Listener.Listen(this.m_MaxConnections);
  91.  
  92.             // Start listening for connections.
  93.             while (m_Listen)
  94.             {
  95.                 Socket Socket = Listener.Accept();
  96.                 ClientHandler clientHandler = new ClientHandler(Socket, this.m_Host, this.m_Port, "Client");
  97.                 clientHandler.Start();
  98.                 clientHandler.DataReceived += clientHandler_DataReceived;
  99.                 clientHandler.ClientDisconnected += clientHandler_ClientDisconnected;
  100.                 this.Clients.Add(clientHandler);
  101.                 foreach (ClientHandler client in this.Clients)
  102.                 {
  103.                     client.Name = "Client" + this.Clients.IndexOf(client).ToString();
  104.                 }
  105.                 if (ClientConnected != null)
  106.                     ClientConnected(clientHandler);
  107.             }
  108.         }
  109.  
  110.         private void clientHandler_ClientDisconnected(Server.ClientHandler client)
  111.         {
  112.             this.Clients.Remove(client);
  113.             this.ClientDisconnected(client);
  114.         }
  115.  
  116.         /// <summary>
  117.         ///
  118.         /// </summary>
  119.         public void StopListening()
  120.         {
  121.             this.m_Listen = false;
  122.             foreach (ClientHandler client in this.Clients)
  123.             {
  124.                 client.Stop();
  125.             }
  126.             this.Listener.Shutdown(SocketShutdown.Both);
  127.             this.Listener.Close();
  128.         }
  129.  
  130.         private void clientHandler_DataReceived(ClientHandler client, CustomEventArgs.DataEventArgs e)
  131.         {
  132.             if (this.DataReceived != null)
  133.                 this.DataReceived(client, e);
  134.         }
  135.  
  136.  
  137.         public class ClientHandler
  138.         {
  139.             private Socket m_Socket;
  140.             private Thread m_WorkerThread;
  141.             private string m_Data;
  142.             private string m_Host;
  143.             private string m_Name;
  144.             private int m_Port;
  145.             private volatile bool m_ShouldStop = false;
  146.  
  147.             public delegate void DataReceivedHandler(ClientHandler client, CustomEventArgs.DataEventArgs e);
  148.             public delegate void ClientDisconnectedHandler(ClientHandler client);
  149.  
  150.             public event DataReceivedHandler DataReceived;
  151.             public event ClientDisconnectedHandler ClientDisconnected;
  152.  
  153.             public Socket Socket
  154.             {
  155.                 get { return m_Socket; }
  156.             }
  157.  
  158.             public string Name
  159.             {
  160.                 get { return m_Name;  }
  161.                 set { this.m_Name = value; }
  162.             }
  163.  
  164.             public Thread WorkerThread
  165.             {
  166.                 get { return m_WorkerThread; }
  167.             }
  168.  
  169.             public ClientHandler(Socket socket, string host, int port, string name)
  170.             {
  171.                 this.m_Host = host;
  172.                 this.m_Port = port;
  173.                 this.m_Socket = socket;
  174.                 this.m_Name = name;
  175.             }
  176.  
  177.             public void Start()
  178.             {
  179.                 m_WorkerThread = new Thread(Work);
  180.                 m_WorkerThread.Start();
  181.             }
  182.  
  183.             public void Stop()
  184.             {
  185.                 this.m_ShouldStop = true;
  186.             }
  187.  
  188.             private void Work()
  189.             {
  190.                 // Data buffer for incoming data.
  191.                 byte[] bytes = new Byte[1024];
  192.  
  193.                 // An incoming connection needs to be processed.
  194.                 while (m_ShouldStop == false)
  195.                 {
  196.                     try
  197.                     {
  198.                         bytes = new byte[1024];
  199.                         int bytesRec = this.m_Socket.Receive(bytes);
  200.                         m_Data = "";
  201.                         m_Data += Encoding.ASCII.GetString(bytes, 0, bytesRec);
  202.                         if (m_Data.IndexOf("<EOF>") > -1)
  203.                         {
  204.                             if (DataReceived != null)
  205.                                 DataReceived(this, new CustomEventArgs.DataEventArgs(m_Data));
  206.                         }
  207.                     }
  208.                     catch (SocketException ex)
  209.                     {
  210.                         m_ShouldStop = true;
  211.                         Console.WriteLine("Connection Dropped by " + this.Name);
  212.                     }
  213.                 }
  214.  
  215.                 if (this.m_Socket != null && this.m_Socket.Connected)
  216.                 {
  217.                     this.m_Socket.Shutdown(SocketShutdown.Both);
  218.                     this.m_Socket.Close();
  219.                 }
  220.  
  221.                 if (ClientDisconnected != null)
  222.                     ClientDisconnected(this);
  223.             }
  224.         }
  225.     }
  226.  
  227.     /// <summary>
  228.     /// Synchronous Client. Taken from MSDN. http://msdn.microsoft.com/en-us/library/kb5kfec7(v=vs.110).aspx
  229.     /// This class was taken and edited by me, adding a class constructor, and custom event calls were added for the purpose of multi-treading
  230.     /// </summary>
  231.     public class Client
  232.     {
  233.         private int m_Port;
  234.         private string m_Host;
  235.         private IPEndPoint remoteEP;
  236.         private IPAddress ipAddress;
  237.  
  238.         public Socket Socket;
  239.  
  240.         public delegate void ClientConnectedHandler(Socket socket, CustomEventArgs.DataEventArgs e);
  241.         public delegate void ClientErrorHandler(CustomEventArgs.DataEventArgs e);
  242.         public delegate void ClientDataSentHandler(CustomEventArgs.DataEventArgs e);
  243.  
  244.         public event ClientConnectedHandler ConnectedEvent;
  245.         public event ClientErrorHandler ErrorEvent;
  246.         public event ClientDataSentHandler DataSentEvent;
  247.         public Client(string host = "127.0.0.1", int port = 100)
  248.         {
  249.             this.m_Host = host;
  250.             this.m_Port = port;
  251.             this.InitializeSocket();
  252.         }
  253.         public void InitializeSocket() {
  254.             try
  255.             {
  256.                 // Establish the remote endpoint for the socket.
  257.                 ipAddress = IPAddress.Parse(this.m_Host);
  258.                 remoteEP = new IPEndPoint(ipAddress, this.m_Port);
  259.  
  260.                 // Create a TCP/IP  socket if it hasn't already been created
  261.                 if (Socket == null)
  262.                     Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  263.  
  264.                 // Attempt to make a connection
  265.                 Socket.Connect(remoteEP);
  266.  
  267.                 // Give the socket time to initialize
  268.                 while (!Socket.Connected) ;
  269.  
  270.                 // Flag out to tell the client that the socket has been created
  271.                 if (ConnectedEvent != null)
  272.                     ConnectedEvent(this.Socket, new CustomEventArgs.DataEventArgs(this.m_Host + ":" + this.m_Port.ToString()));
  273.             }
  274.             catch (SocketException ex)
  275.             {
  276.                 if (ex.SocketErrorCode == SocketError.IsConnected)
  277.                     Console.WriteLine("Connection already established");
  278.                 else
  279.                     Console.WriteLine(ex.SocketErrorCode.ToString());
  280.             }
  281.         }
  282.  
  283.         public int Send(string message)
  284.         {
  285.             try
  286.             {
  287.                 byte[] encodedMessage = Encoding.ASCII.GetBytes(message.ToString() + "<EOF>");
  288.                 int bytesSent = this.Socket.Send(encodedMessage);
  289.                 if (DataSentEvent != null)
  290.                     DataSentEvent(new CustomEventArgs.DataEventArgs(message));
  291.                    
  292.                 if (message == "Shutdown")
  293.                 {
  294.                     this.Socket.Shutdown(SocketShutdown.Both);
  295.                     this.Socket.Close();
  296.                 }
  297.                 return bytesSent;
  298.             }
  299.             catch (SocketException ex)
  300.  
  301.             {
  302.                 Console.WriteLine(ex.SocketErrorCode.ToString());
  303.                 return 0;
  304.             }
  305.         }
  306.     }
  307. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement