为啥不读取 NetworkStream 中的数据? .net TcpClient

Posted

技术标签:

【中文标题】为啥不读取 NetworkStream 中的数据? .net TcpClient【英文标题】:Why data from NetworkStream do not read? .net TcpClient为什么不读取 NetworkStream 中的数据? .net TcpClient 【发布时间】:2020-10-01 01:39:09 【问题描述】:

我有客户端层和服务器层。客户端发送转换为字节数组整数变量。 我正在使用 TcpClient 和 TcpListener,并使用 NetworkStream 来写入和读取数据。出于某种原因,服务器不从 NetworkStream 读取数据,尽管我使用了这个问题的建议:How to get all data from NetworkStream

客户层:

   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();

服务器层

  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;
        

【问题讨论】:

接受第一个客户端后,您读取数据。但可能还没有数据。所以你只需停止服务器。接受后尝试插入睡眠 【参考方案1】:

这是因为您在接收数据之前关闭服务器,移动或移除Server.Stop并换行,例如:

 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
        

【讨论】:

以上是关于为啥不读取 NetworkStream 中的数据? .net TcpClient的主要内容,如果未能解决你的问题,请参考以下文章

如何停止从 NetworkStream 读取?

调整缓冲区长度以从 NetworkStream 读取小数据

读取ftp文件最后一行以后报错,无法访问已释放的对象。 对象名:System.Net.Sockets.NetworkStream

NetworkStream 睡眠()问题

通过 NetworkStream 传输档案

C# 通过tcp协议向硬件发送命令,networkstream read 读取返回信息时卡死。