c# - C# 中 networkstream.read() 的奇怪行为

标签 c# tcp network-programming

当我向网络流写入两个单独的字节数组时,有时我得不到第一个字节数组。 这是为什么?

例如,这失败了,没有收到 header ,有时由另一端的 Read() 接收

            byte[] header = msg.getByteHeader();
            byte[] data = msg.getByteData();
            clientStream.Write(header, 0, header.Length);
            clientStream.Write(data, 0, data.Length);
            clientStream.Flush();

然而这成功了

                NetworkStream clientStream = tcpClient.GetStream();
                byte[] header = msg.getByteHeader();
                byte[] data = msg.getByteData();
                int pos = 0;
                Array.Copy(header, 0, message, pos, header.Length);
                pos += header.Length;
                Array.Copy(data, 0, message, pos, data.Length);
                clientStream.Write(message, 0, message.Length);

这是我的 Read() 的样子

           try
            {
                //blocks until a client sends a message
                bytesRead = clientStream.Read(message, 0, 4);
                //string stringData = Encoding.ASCII.GetString(message, 0, bytesRead);
                len = BitConverter.ToInt32(message, 0);
                //MessageBox.Show(len.ToString());
                bytesRead = clientStream.Read(message, 0, 5 + len);

            }

最佳答案

我认为这是一个时间问题。在您第一次打开套接字通信和您可以从缓冲区中读取第一个数据之间存在滞后。这不是瞬间的。您可以在尝试读取之前查询网络流的 DataAvailable bool 状态。如果没有 DataAvailable,则让线程休眠 100 毫秒,然后再次尝试读取。

关于c# - C# 中 networkstream.read() 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1376818/

相关文章:

c# - 在多宿主 Windows 10 计算机上接收 UDP 多播消息

linux - 完成压缩 IP 报头的 Xmit

c# - 在 foreach 循环中解析 XML

c# - 最小起订量错误 "An expression tree may not contain a call or invocation that uses optional arguments"

c - 在这种情况下,我该如何使用char指针?(Windows中的SOCKET编程)

c++ - 在同一连接或拆分连接上流式传输视频和命令?

c# - 如何在Windows中运行应用程序?

c# - 如何将 session 值从代码隐藏传递到javascript

.net - 立即检测客户端与服务器套接字的断开连接

c - 在c代码的非阻塞设计中选择