Search code examples
c#.netsocketsnetwork-programmingtcpclient

Why data from NetworkStream do not read? .net TcpClient


I have Client layer and Server Layer. Client send converted to byte array integer varible. I am using TcpClient and TcpListener, and use NetworkStream to write and read data. For some reason Server do not read data from NetworkStream, inspite that i use advice from this question: How to get all data from NetworkStream

Client Layer:

   TcpClient sender1 = new TcpClient();
                        sender1.Connect(ip, port);

                        using (NetworkStream stream1 = client.GetStream())
                        {
                            int isCorrect = 1;
                            byte[] data = BitConverter.GetBytes(isCorrect);
                            stream1.Write(data, 0, data.Length);
                        }
                        sender1.Close();

Server Layer

  TcpListener server = new TcpListener(IPAddress.Parse(ip), serverPort);
  server.Start();

        while (true)
        {
            TcpClient enterWaiter = server.AcceptTcpClient();
            using (NetworkStream stream1 = enterWaiter.GetStream())
            {
                byte[] buffer = new byte[4];
                using (MemoryStream ms = new MemoryStream())
                {
                    int read;
                    while ((read = stream1.Read(buffer, 0, buffer.Length)) > 0)
                    {
                        ms.Write(buffer, 0, read);
                    }
                    Console.WriteLine($"{ms.ToArray()}");
                }
            }
            server.Stop();
            break;
        }

Solution

  • It is because you are closing the server prior to receiving your data, move or remove the Server.Stop and break lines, such as:

     TcpListener server = new TcpListener(IPAddress.Parse(ip), serverPort);
      server.Start();
    
            while (true)
            {
                TcpClient enterWaiter = server.AcceptTcpClient();
                using (NetworkStream stream1 = enterWaiter.GetStream())
                {
                    byte[] buffer = new byte[4];
                    using (MemoryStream ms = new MemoryStream())
                    {
                        int read;
                        while ((read = stream1.Read(buffer, 0, buffer.Length)) > 0)
                        {
                            ms.Write(buffer, 0, read);
                        }
                        Console.WriteLine($"{ms.ToArray()}");
                    }
                }
                //server.Stop(); <-- (Re)move
                //break; <-- (Re)move
            }