如何实现TCPClient成功接收数据后才继续执行后续脚本?
正确实现TCP客户端接收确认的方案
现有逻辑的核心问题
你当前的思路存在根本误区:NetworkStream.ReadByte()返回-1的触发条件是TCP连接对端已经主动关闭了写入通道(调用了Shutdown(SocketShutdown.Send)或直接关闭连接),完全不能代表客户端已经成功接收数据,这套逻辑无法实现你要的确认效果。
可行实现方案
你需要在TCP层之上自定义应用层确认逻辑,具体步骤如下:
- 服务端先向客户端发送需要更新的数值数据
- 客户端收到数据、完成本地数值更新操作后,主动向服务端发送提前约定好的单字节确认数据包(比如固定发送
0x01作为更新完成标识) - 服务端发送完数据后,阻塞等待读取客户端发回的确认字节:
// 服务端示例代码 // 先向客户端发送更新数据 stream.Write(updateData, 0, updateData.Length); // 阻塞等待客户端返回确认信息 int confirmByte = stream.ReadByte(); if (confirmByte == 0x01) // 匹配提前约定的确认标识 { // 确认客户端已完成更新,启动计时器 StartYourTimer(); }
- 对应客户端的处理逻辑:
// 客户端示例代码 // 读取服务端发送的更新数据 stream.Read(receiveBuffer, 0, receiveBuffer.Length); // 执行本地数值更新逻辑 DoValueUpdate(receiveBuffer); // 向服务端发送确认字节 stream.WriteByte(0x01); // 执行后续本地脚本 RunNextScript();
注意事项
- 提前约定确认用的字节值,避免和业务数据冲突,也可以约定更长的确认报文降低误判概率
- 如果担心丢包或超时,可以给服务端的读取操作添加超时判断,超时后可重试发送数据或走异常处理流程
内容的提问来源于stack exchange,提问作者itsme11
相关产品推荐
相关产品推荐

