Thursday, December 2, 2010

Synchronous Client Server Application in C#

TCP Based Server

  • Establish the local end point for the socket
  • Open a socket using Socket()
  • Name the socket using Bind()
  • Listen for incoming connections using Listen(), parameter inside the method specifies the maximu number of pending connections
  • Accept client connections using Accept(), a new socket is created here but the original socket keeps listen
  • Send, Receive data using Send() and Receive()
  • Close Socket using Close()

Server.cs

   using System; 
   using System.Net.Sockets; 
   using System.Net; 
   using System.Text; 

   public class SocketServer 
   { 
      public static void Main(string [] args) 
      { 

         // establish the local end point for the socket 
         IPHostEntry ipHost = Dns.Resolve("localhost"); 
         IPAddress ipAddr = ipHost.AddressList[0]; 
         IPEndPoint ipEndPoint = new IPEndPoint(ipAddr, 11000); 

         // create a Tcp/Ip Socket 
         Socket sListener = new Socket(AddressFamily.InterNetwork, 
                                       SocketType.Stream, ProtocolType.Tcp); 

         // bind the socket to the local endpoint and 
         // listen to the incoming sockets 

         try 
         { 
            sListener.Bind(ipEndPoint); 
            sListener.Listen(10); 

            // Start listening for connections 

            while (true) 
            { 
               Console.WriteLine("Waiting for a connection on port {0}",ipEndPoint); 

               // program is suspended while waiting for an incoming connection 
               Socket handler = sListener.Accept(); 

               string data = null; 

               // we got the client attempting to connect 
               while(true) 
               { 
                  byte[] bytes = new byte[1024]; 

                  int bytesRec = handler.Receive(bytes); 

                  data += Encoding.ASCII.GetString(bytes, 0, bytesRec); 

                  if (data.IndexOf("<theend>") > -1) 
                  { 
                     break; 
                  } 
               } 

               // show the data on the console 
               Console.WriteLine("Text Received: {0}",data); 

               string theReply = "Thank you for those " + data.Length.ToString() 
                               + " characters..."; 
               byte[] msg = Encoding.ASCII.GetBytes(theReply); 

               handler.Send(msg); 
               handler.Shutdown(SocketShutdown.Both); 
               handler.Close(); 
            } 
         } 
         catch(Exception e) 
         { 
            Console.WriteLine(e.ToString()); 
         } 

      } // end of Main 
   } 



TCP Based Client

  • Establish a remote endpoint
  • Open a socket using Socket()
  • Connect to the remote host using Connect
  • Send, receive data using Send() and Receive()
  • Close Socket using Close()

Client.cs

using System; 
using Systern.Net.Sockets; 
using Systern.Net; 
using Systern.Text; 

public class SocketClient 
{ 
   public static void Main(string [] args) 
   {

    // data buffer for incoming data 
    byte[] bytes = new byte[1024]; 

    // connect to a Remote device 
    try 
    { 
       // Establish the remote end point for the socket 
       IPHostEntry ipHost = Dns.Resolve("127.0.0.1"); 
       IPAddress ipAddr = ipHost.AddressList[0]; 
       IPEndPoint ipEndPoint = new IPEndPoint(ipAddr, 11000); 

       Socket sender = new Socket(AddressFamily.Internetwork, 
                                  SocketType.Stream, ProtocolType.Tcp); 

       // Connect the socket to the remote endpoint 

          sender.Connect(ipEndPoint); 

          Console.WriteLine("Socket connected to {0}", 
          sender.RemoteEndPoint.ToString()); 

          string theMessage = "This is a test"; 

          byte[] msg = Encoding.ASCII.GetBytes(theMessage+"<theend>"); 

          // Send the data through the socket 
          int bytesSent = sender.Send(msg); 

          // Receive the response from the remote device 
          int bytesRec = sender.Receive(bytes); 

          Console.WriteLine("The Server says : {0}", 
                            Encoding.ASCII.GetString(bytes,0, bytesRec)); 

          // Release the socket 
          sender.Shutdown(SocketShutdown.Both); 
          sender.Close(); 

    } 
    catch(Exception e) 
    { 
       Console.WriteLine("Exception: {0}", e.ToString()); 
    } 
  } 
} 



Fllowing image shows how client and server send and receive data

No comments :

Post a Comment