【问题标题】:How to continue with a script only after it was received by a TCPClient?仅在 TCPClient 接收到脚本后如何继续执行脚本?
【发布时间】:2021-11-01 19:12:24
【问题描述】:

我想过向服务器发送一个带有一个字节的数据包,并在服务器端写入以下代码:

int a= stream.ReadByte()
if(a==-1){
//client received data 
}

流是 NetworkStream
我想这样做是因为在此之后我在服务器上启动了一个计时器。只有当客户端更新了它们的值时,计时器才应该启动。

【问题讨论】:

  • 请详细说明您要解决的实际问题。
  • 为什么没有收到?
  • 你还想让我解释更多我的问题吗? @500-InternalServerError
  • 我不认为它没有收到问题是何时收到@CaiusJard
  • 题为“如何检查TCPClient是否收到数据?” - 是否暗示“它是/它不是”,即客户端发送了一些数据并且它确实/没有到达;它与事件发生的时间无关。我问你为什么认为它不是因为 TCP 是一种可靠的传输机制

标签: c# tcp


【解决方案1】:

Stream 的选项有限:

  • 它可以返回一个正数表示“是的,我提供了这么多数据”
  • 它可以返回一个非正数数字来表示“EOF:我没有数据,并且永远不会有更多数据”
    • (上面的映射也与ReadByte()类似,除了第二点因为没有数据而变为“负数”)
  • 它可以阻塞,等待上述两个条件之一成为可能
  • 它可以抛出异常

不能做的是说“我目前没有数据,但我将来可能会”。因此,您不能使用Stream API 来检查是否有 数据。相反,通常使用异步 API(通常在 Socket 本身,或不是 Stream 的另一个抽象),以允许您处理回调数据可用。 .Socket 上还有 .Available 属性,它告诉您当前缓冲并可供使用的数据量(注意:此 API 通常仅用于在同步与异步 IO 之间进行选择)。

【讨论】:

  • 我知道 NetworkStream.Read() 方法一直等到它收到数据。 NetworkStream.ReadByte() 方法是否以相同的方式工作但只读取一个字节?
  • @solelyme 是的;和Peek() 一样;因此我所说的使用异步回调或检查.Available
猜你喜欢
  • 2017-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-21
  • 1970-01-01
  • 2020-07-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多