Wednesday, 22 August 2018

Two way communication in C# client and socket

This in continuation to my previous post. In previous post, I explained how to send some information from client to server. In this post, I am going to give an example, where client send a string to server, server converts the string to upper case and send back to client. Client prints the response to console.

Server.cs
using System;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace Server
{
    public class ServerSocket
    {
        private int port;
        private Socket serverSocket;

        public ServerSocket(int port)
        {
            this.port = port;
            serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), port);

            /* Associates a Socket with a local endpoint. */
            serverSocket.Bind(serverEndPoint);

            /*Places a Socket in a listening state.
             * The maximum length of the pending connections queue is 100 
             */
            serverSocket.Listen(100);
        }

        public void start()
        {
            Console.WriteLine("Starting the Server");

            /* Accept Connection Requests */
            Socket accepted = serverSocket.Accept();

            /* Get the size of the send buffer of the Socket. */
            int bufferSize = accepted.SendBufferSize;
            byte[] buffer = new byte[bufferSize];

            /* Receives data from a bound Socket into a receive buffer. It return the number of bytes received. */
            int bytesRead = accepted.Receive(buffer);

            byte[] formatted = new byte[bytesRead];

            for (int i = 0; i < bytesRead; i++)
            {
                formatted[i] = buffer[i];
            }

            String receivedData = Encoding.UTF8.GetString(formatted);
            Console.WriteLine("Received Data " + receivedData);

            String response = receivedData.ToUpper();
            byte[] resp = Encoding.UTF8.GetBytes(response);
            accepted.Send(resp, 0, resp.Length, 0);

            Console.WriteLine("Press some key to close");
            Console.Read();
        }
    }
    class Server
    {
        static void Main(string[] args)
        {
            ServerSocket server = new ServerSocket(1234);
            server.start();
        }
    }
}

Client.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;

namespace client
{
    public class ClientSocket
    {
        private Socket clientSocket;
        private int port;

        public ClientSocket(int port)
        {
            this.port = port;
            clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        }

        public void start()
        {
            Console.WriteLine("Starting client socket");
            try
            {
                IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), port);
                clientSocket.Connect(serverEndPoint);

                Console.WriteLine("Enter some data to send to server");

                String data = Console.ReadLine();

                byte[] bytes = Encoding.UTF8.GetBytes(data);

                clientSocket.Send(bytes);

                int receiveBufferSize = clientSocket.ReceiveBufferSize;
                byte[] buffer = new byte[receiveBufferSize];


                int receivedBytes = clientSocket.Receive(buffer);
                byte[] receivedData = new byte[receivedBytes];

                for (int i = 0; i < receivedBytes; i++)
                {
                    receivedData[i] = buffer[i];
                }

                String received = Encoding.UTF8.GetString(receivedData);

                Console.WriteLine("Response : {0}", received);

                Console.WriteLine("Press Enter to close");
                Console.WriteLine("Closing connection");
                Console.Read();
                clientSocket.Close();
            }
            catch (Exception e)
            {
                Console.WriteLine("Error while connectiong to server {0}", e.Message);
            }
        }
    }

    class Client
    {
        static void Main(string[] args)
        {
            ClientSocket clientSocket = new ClientSocket(1234);
            clientSocket.start();

        }
    }
}

Run Server.cs, server starts listening on port.

Run Client.cs and enter some data, it get the response in uppercase.

Sample Response

Starting client socket
Enter some data to send to server
Hello World
Response : HELLO WORLD
Press Enter to close
Closing connection


Previous                                                 Next                                                 Home

No comments:

Post a Comment