title: Multithreaded TCP server and client
body: <p>I just search around before asking this problem, looking for example of TCP Server and Client in C#.</p>
  
  <p>I found <a href="http://csharp.net-informations.com/communications/csharp-multi-threaded-server-socket.htm" rel="nofollow noreferrer">this</a> link, I just used the given code by the link but unfortunately there's a problem and I'm stuck!</p>
  
  <p>The following code is the complete code for server (console):</p>
  
  <pre><code>using System;
  using System.Collections.Generic;
  using System.Linq;
  using System.Text;
  using System.Net.Sockets;
  
  namespace TCP_Server_Console
  {
      class Program
      {
          static void Main(string[] args)
          {
              TcpListener serverSocket = new TcpListener(8888);
              int requestCount = 0;
              TcpClient clientSocket = default(TcpClient);
              serverSocket.Start();
              Console.WriteLine(" &gt;&gt; Server Started");
              clientSocket = serverSocket.AcceptTcpClient();
              Console.WriteLine(" &gt;&gt; Accept connection from client");
              requestCount = 0;
  
              while ((true))
              {
                  try
                  {
                      requestCount = requestCount + 1;
                      NetworkStream networkStream = clientSocket.GetStream();
                      byte[] bytesFrom = new byte[10025];
                      networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);
                      string dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom);
                      dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$"));
                      Console.WriteLine(" &gt;&gt; Data from client - " + dataFromClient);
                      string serverResponse = "Last Message from client" + dataFromClient;
                      Byte[] sendBytes = Encoding.ASCII.GetBytes(serverResponse);
                      networkStream.Write(sendBytes, 0, sendBytes.Length);
                      networkStream.Flush();
                      Console.WriteLine(" &gt;&gt; " + serverResponse);
                  }
                  catch (Exception ex)
                  {
                      Console.WriteLine(ex.ToString());
                  }
              }
  
              clientSocket.Close();
              serverSocket.Stop();
              Console.WriteLine(" &gt;&gt; exit");
              Console.ReadLine();
          }
      }
  }
  
  /*HandleClient Class */
  using System;
  using System.Collections.Generic;
  using System.Linq;
  using System.Net.Sockets;
  using System.Text;
  using System.Threading;
  using System.Threading.Tasks;
  
  namespace TCP_Server_Console
  {
      public class HandleClient
      {
          TcpClient clientSocket;
          string clNo;
  
          public void startClient(TcpClient inClientSocket, string clineNo)
          {
              this.clientSocket = inClientSocket;
              this.clNo = clineNo;
              Thread ctThread = new Thread(doChat);
              ctThread.Start();
          }
  
          private void doChat()
          {
              int requestCount = 0;
              byte[] bytesFrom = new byte[10025];
              string dataFromClient = null;
              Byte[] sendBytes = null;
              string serverResponse = null;
              string rCount = null;
              requestCount = 0;
  
              while ((true))
              {
                  try
                  {
                      requestCount = requestCount + 1;
                      NetworkStream networkStream = clientSocket.GetStream();
                      networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);
                      dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom);
                      dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$"));
                      Console.WriteLine(" &gt;&gt; " + "From client-" + clNo + dataFromClient);
                      rCount = Convert.ToString(requestCount);
                      serverResponse = "Server to clinet(" + clNo + ") " + rCount;
                      sendBytes = Encoding.ASCII.GetBytes(serverResponse);
                      networkStream.Write(sendBytes, 0, sendBytes.Length);
                      networkStream.Flush();
                      Console.WriteLine(" &gt;&gt; " + serverResponse);
                  }
                  catch (Exception ex)
                  {
                      Console.WriteLine(" &gt;&gt; " + ex.ToString());
                  }
              }
          }
      }
  }
  </code></pre>
  
  <p>The following code is the complete code for client (Windows Forms):</p>
  
  <pre><code>using System;
  using System.Collections.Generic;
  using System.ComponentModel;
  using System.Data;
  using System.Drawing;
  using System.Linq;
  using System.Net.Sockets;
  using System.Text;
  using System.Threading.Tasks;
  using System.Windows.Forms;
  
  namespace TCP_Client_Sample
  {
      public partial class Form1 : Form
      {
          System.Net.Sockets.TcpClient clientSocket = new System.Net.Sockets.TcpClient();
          NetworkStream serverStream;
  
          public Form1()
          {
              InitializeComponent();
          }
          private void Form1_Load(object sender, EventArgs e)
          {
              label_status.Text = "Client Started, Connecting...";
  
              try 
              {
                  clientSocket.Connect("127.0.0.1", 8888);
  
                  if (clientSocket.Connected)
                  {
                      label_status.Text = "Connected";
                      label_status.ForeColor = Color.Green;
                  }
               }
               catch (Exception xe) 
               {
                    MessageBox.Show("OOPS!!! SERVER MUST BE STARTED FIRST! \n\n" + xe.ToString());
               }
          }
  
          //Function to Send Message to Server (On Button Click)
          private void btn_send_Click(object sender, EventArgs e)
          {
              try 
              {
                  NetworkStream serverStream = clientSocket.GetStream();
                  byte[] outStream = System.Text.Encoding.ASCII.GetBytes("Message From Client$");
                  serverStream.Write(outStream, 0, outStream.Length);
                  serverStream.Flush();
                  byte[] inStream = new byte[10025];
                  serverStream.Read(inStream, 0, (int)clientSocket.ReceiveBufferSize);
                  string returnData = System.Text.Encoding.ASCII.GetString(inStream);
                  chatBox.AppendText("&gt;&gt; Server: " + returnData);
              }
              catch (Exception ex) 
              {
                  MessageBox.Show("Unable to Send Data: " + ex);
              }
          }
      }
  }
  </code></pre>
  
  <p>Every time I execute the code of server it works and started. But when I execute the client, the server throws an error </p>
  
  <blockquote>
    <p>Specified Argument was out of the range</p>
  </blockquote>
  
  <p>Here is the complete error:</p>
  
  <blockquote>
    <p>System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values.</p>
    
    <p>Parameter name: size</p>
    
    <p>at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)<br>
    at TCP_Server_Console.Program.Main(String[] args) in C:\Users\user\Documents\Visual Studio 2015\Projects\TCP_Server_Console\TCP_Server_Console\Program.cs:line 50</p>
  </blockquote>
  
  <p>I'm also getting the same error every time I click the <code>btn_send</code> from client form.</p>
  
  <p>I am stuck here and I don't know what's the problem since this is the first time I'm work with TCP Socket.</p>
  
  <p>Can anynone help me?</p>