【问题标题】:c# Make TcpServer Blockc# 使 TcpServer 阻塞
【发布时间】:2014-12-15 03:19:09
【问题描述】:

我正在使用 C# 来制作服务器和客户端。我希望它阻止我正在做的事情。当我使用 NetworkStream.read() 时,它会阻塞,我喜欢这样。问题是当我使用 NetworkStream.ReadByte() 时,它不会阻塞。相反,当没有传入字节时,它返回 -1。如何让 NetworkStream.ReadByte() 像 NetworkStream.read() 一样阻塞?

我尝试将 NetworkStream.ReadByte() 包含在 NetworkStream.DataAvailable 中,但这也不起作用。我只是希望NetworkStream.ReadByte() 阻止。有什么想法吗?

【问题讨论】:

  • 您得到的答案是,根据您的要求,恕我直言是最好的。但是:我认为您应该重新考虑 both 使用阻塞范式的决定,尤其是尝试一次读取一个字节的决定。

标签: c# network-programming tcpclient tcplistener


【解决方案1】:

为什么不直接使用:

byte[] buf = new byte[1];
stream.Read(buf, 0, 1);

编辑:当然,如果您经常这样做,请不要每次都分配新缓冲区,将其作为字段存储在对象上并在构造函数中分配。

【讨论】:

  • 我正在尝试使用 NetworkStream.ReadByte() 来提高效率,因为它返回一个字节。没有办法修复 NetworkStream.ReadByte() 并使其阻塞?
  • 如果你担心效率,你不应该一次读取一个块:) “尽可能高效” - Read() 和 ReadByte 之间应该没有性能差异(),前提是您只分配一次缓冲区。
  • 谢谢。我重新启动了计算机,现在它阻塞了。我还是决定用你的方法。我正在做的实际上是尝试使用 Unity3D 将视频从我的相机流式传输到另一台计算机。现在,它看起来像是老式计算器上显示的图像幻灯片 :) 我正在通过网络发送 307200 字节,大约需要 3-5 分钟才能到达。大声笑
【解决方案2】:

ReadByte 块。它仅在流结束时返回 -1。你一定是误解了你所看到的。将 ReadByte 替换为 nevelis 建议的解决方法,您不会发现行为有任何差异。

【讨论】:

  • 你是对的。我重新启动计算机后,它开始阻塞。这很奇怪。我将给予 nevelis 证明代码答案的功劳。谢谢。我用他的答案而不是 ReadByte。
  • 我认为它应该被阻止... :D 这应该是公认的答案。
【解决方案3】:

在 MSDN 文档中找不到任何明确的内容,但现在我们有了开源 CoreFX,我们可以查看实现:

https://github.com/dotnet/corefx/blob/1bd332f2e5f559c2eab276acb0d9e4256085ec2f/src/System.Net.Sockets/src/System/Net/Sockets/NetworkStream.cs

https://github.com/dotnet/corefx/blob/1bd332f2e5f559c2eab276acb0d9e4256085ec2f/src/System.IO/src/System/IO/Stream.cs

NetworkStream 覆盖 Read 以调用阻塞的 Socket.Receive,但不会覆盖 ReadByte。 Stream.ReadByte 只是调用 Read,因此 NetworkStream.ReadBytes 将调用阻塞的 NetworkStream.Read。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    • 2012-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多