gpt4 book ai didi

sockets - 从 NetworkStream 读取特定数量的字节

转载 作者:行者123 更新时间:2023-12-03 22:40:58 25 4
gpt4 key购买 nike

我正在尝试从网络流中读取已知长度的消息。
我有点期待 NetworkStream.Read()将等待返回,直到我给它的缓冲区数组已满。如果不是,那么 ReadTimeout 的意义何在?属性(property)?

我用来测试我的理论的示例代码

public static void Main(string[] args)
{
TcpListener listener = new TcpListener(IPAddress.Any, 10001);
listener.Start();

Console.WriteLine("Waiting for connection...");

ThreadPool.QueueUserWorkItem(WriterThread);

using (TcpClient client = listener.AcceptTcpClient())
using (NetworkStream stream = client.GetStream())
{
Console.WriteLine("Connected. Waiting for data...");

client.ReceiveTimeout = (int)new TimeSpan(0, 1, 0).TotalMilliseconds;
stream.ReadTimeout = (int)new TimeSpan(0, 1, 0).TotalMilliseconds;

byte[] buffer = new byte[1024];
int bytesRead = stream.Read(buffer, 0, buffer.Length);

Console.WriteLine("Got {0} bytes.", bytesRead);
}

listener.Stop();

Console.WriteLine("Press any key to exit...");
Console.ReadKey(true);
}

private static void WriterThread(object state)
{
using (TcpClient client = new TcpClient())
{
client.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 10001));
using (NetworkStream stream = client.GetStream())
{
byte[] bytes = Encoding.UTF8.GetBytes("obviously less than 1024 bytes");
Console.WriteLine("Sending {0} bytes...", bytes.Length);
stream.Write(bytes, 0, bytes.Length);
Thread.Sleep(new TimeSpan(0, 2, 0));
}
}
}

结果是:
Waiting for connection...
Sending 30 bytes...
Connected. Waiting for data...
Got 30 bytes.
Press any key to exit...

是否有一种标准方法可以使同步读取仅在读取指定数量的字节时返回?我确信自己编写一个并不太复杂,但是两个 TcpClient 上都存在超时属性。和 NetworkStream有点暗示它应该已经这样工作了。

最佳答案

所有你保证的是(之一):

  • 0 字节(流结束)
  • 至少 1 个字节(一些数据可用;并不意味着没有更多数据可用或已经可用)
  • 错误(超时等)

  • 要读取指定数量的字节...循环:
    int read = 0, offset = 0, toRead = ...
    while(toRead > 0 && (read = stream.Read(buffer, offset, toRead)) > 0) {
    toRead -= read;
    offset += read;
    }
    if(toRead > 0) throw new EndOfStreamException();

    关于sockets - 从 NetworkStream 读取特定数量的字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7542235/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com