Search code examples
c#socketstcplistener

TCPlistener server-client and client-server ( send message to client from server)


All i want to do is send message to client from server. I try a lot of tutorial etc. but still can't send message from server to client. Send from client to server is simple and have it in code. When client Send "HI" to server i want to respond Hi to client. But dunno what should i add to my code. Can someone help me with that? Please don't do it like duplicate i know there is a lot of similar topic but can't find solution.

Server code:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
  IPAddress ip = Dns.GetHostEntry("localhost").AddressList[0];
  TcpListener server = new TcpListener(ip, Convert.ToInt32(8555));
  TcpClient client = default(TcpClient);
   try
   {
     server.Start();
     Console.WriteLine("Server started...");
   }
   catch (Exception ex)
   {
     Console.WriteLine(ex.ToString());
   };

   while (true)
   {
      client = server.AcceptTcpClient();
      byte[] receivetBuffer = new byte[100];
      NetworkStream stream = client.GetStream();
      stream.Read(receivetBuffer, 0, receivetBuffer.Length);
      StringBuilder msg = new StringBuilder();
      foreach(byte b in receivetBuffer)
      {
          if (b.Equals(59))
          {
            break;
          }
          else
          {
            msg.Append(Convert.ToChar(b).ToString());
          }
      }
       ////Resive message :
       if (msg.ToString() =="HI")
       {
          ///@EDIT 1
          ///// HERE Is SENDING  MESSAGE TO CLIENT//////////  
          int byteCount = Encoding.ASCII.GetByteCount("You said HI" + 1); 
          byte[] sendData = new byte[byteCount];
          sendData = Encoding.ASCII.GetBytes("You said HI" + ";");
          stream.Write(sendData, 0, sendData.Length); 
       }
}

Client code:

private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
{
   try
   {
     string serverIP = "localhost";
     int port = Convert.ToInt32(8555);
     TcpClient client = new TcpClient(serverIP, port);
     int byteCount = Encoding.ASCII.GetByteCount("HI"+ 1);
     byte[] sendData = new byte[byteCount];
     sendData = Encoding.ASCII.GetBytes("HI" + ";");
     NetworkStream stream = client.GetStream();
     stream.Write(sendData, 0, sendData.Length);


    ///////////////////////////////HERE I WANT A read message from server/
    /////////////////////////////////////////////////////////////////////

     stream.Close();
     client.Close();
     }
     catch(Exception ex)
     {
       ex.ToString();
     }
}

Solution

  • Try this Here is my version of client and server ,feel free to ask if any reference problem ,the client wait for server to (online) then if server is online connect with it.

    Method to Connect with Server

     private void Connectwithserver(ref TcpClient client)
        {
            try
            {
                 //this is server ip and server listen port
                server = new TcpClient("192.168.100.7", 8080);
            }
            catch (SocketException ex)
            {
                //exceptionsobj.WriteException(ex);
                Thread.Sleep(TimeSpan.FromSeconds(10));
                RunBoTClient();
    
            }
        }
    
     byte[] data = new byte[1024];
        string stringData;
        TcpClient client;
    
        private void RunClient()
        {
             NetworkStream ns;
            Connectwithserver(ref client);
    
             while (true)
            {
                ns = client.GetStream();
                //old
                // ns.ReadTimeout = 50000;
                //old
                ns.ReadTimeout = 50000;
                ns.WriteTimeout = 50000;
    
                int recv = default(int);
                try
                {
    
    
                    recv = ns.Read(data, 0, data.Length);
    
    
                }
                catch (Exception ex)
                {
    
                    //exceptionsobj.WriteException(ex);
                    Thread.Sleep(TimeSpan.FromSeconds(10));
                   //try to reconnect if server not respond 
                    RunClient();
                }
             //READ SERVER RESPONSE/MESSAGE
                stringData = Encoding.ASCII.GetString(data, 0, recv);
            }
    
        }
    

    Server

    IPAddress localAdd = IPAddress.Parse(SERVER_IP);
        TcpListener listener = new TcpListener(localAdd, PORT_NO);
        Console.WriteLine("Listening...");
        listener.Start();
        while (true)
        {
            //---incoming client connected---
            TcpClient client = listener.AcceptTcpClient();
    
            //---get the incoming data through a network stream---
            NetworkStream nwStream = client.GetStream();
            byte[] buffer = new byte[client.ReceiveBufferSize];
    
            //---read incoming stream---
            int bytesRead = nwStream.Read(buffer, 0, client.ReceiveBufferSize);
    
            //---convert the data received into a string---
            string dataReceived = Encoding.ASCII.GetString(buffer, 0, bytesRead);
            Console.WriteLine("Received : " + dataReceived);
    
             //IF YOU WANT TO WRITE BACK TO CLIENT USE
           string yourmessage = console.ReadLine();
            Byte[] sendBytes = Encoding.ASCII.GetBytes(yourmessage);
            //---write back the text to the client---
            Console.WriteLine("Sending back : " + yourmessage );
            nwStream.Write(sendBytes, 0, sendBytes.Length);
            client.Close();
        }
        listener.Stop();