c# - 在 Tcp 通信期间使用 StreamReader
问题描述
我正在尝试学习如何在 C# 中实现 TCP 通信,但我对 StreamReader 如何知道发送方何时不再发送数据感到有些困惑。
private async void TakeCareOfTCPClient(TcpClient paramClient)
{
NetworkStream stream = null;
StreamReader reader = null;
try
{
stream = paramClient.GetStream();
reader = new StreamReader(stream);
char[] buff = new char[64];
while (KeepRunning)
{
Debug.WriteLine("*** Ready to read");
int nRet = await reader.ReadAsync(buff, 0, buff.Length);
System.Diagnostics.Debug.WriteLine("Returned: " + nRet);
if (nRet == 0)
{
RemoveClient(paramClient); //This removes the client from a list containing
// all connected clients to the server.
System.Diagnostics.Debug.WriteLine("Socket disconnected");
break;
}
string receivedText = new string(buff);
System.Diagnostics.Debug.WriteLine("*** RECEIVED: " + receivedText);
Array.Clear(buff, 0, buff.Length);
}
}
catch (Exception excp)
{
RemoveClient(paramClient);
System.Diagnostics.Debug.WriteLine(excp.ToString());
}
}
假设客户端发送的消息长度正好为 64 个字符。但是,客户端不会断开与服务器的连接,并且可以在稍后发送另一条消息(假设消息之间经过大量时间)。调用此方法的服务器是否会立即尝试再次读取并将客户端从其连接列表中删除,因为客户端尚未发送另一条消息(即读取了 0 个字符)?假设它没有,那么导致服务器等待另一条消息而不返回 0 的流(可能是它包含的特殊字符或它具有的隐藏状态)是什么?
解决方案
reader.ReadAsync
因此,该代码在返回时停止0
。
文档的备注部分Stream.Read
掌握了何时发生这种情况的关键:
仅当流中没有更多数据并且不需要更多数据时(例如关闭的套接字或文件结尾),Read 才返回 0。
因此,由于底层流是一个 TCP 连接,当 TCP 连接关闭时ReadAsync
将返回0
(并且将返回)。TakeCareOfTCPClient
连接的任何一方都可以关闭连接。
推荐阅读
- javascript - 如何从角度数组中获取唯一行
- php - “已经为此令牌创建了成功的计费协议。”
- javascript - 如何从外部链接导航到引导程序 4 的特定选项卡
- ffi - 尝试创建绑定的访问器名称冲突
- hibernate - 由带有 LazyNoProxy 注释的 JoinColumns 映射的实体的提取不适用于标准查询 - 导致 n + 查询
- javascript - 如何使用图片点击事件
- swift - 如何使用快速编码根据特定的排序顺序对自定义对象进行排序
- url - 如何使用带有“单击此处”标签的 pdfbox 在 pdf 中插入 URL 以重定向到网站?
- caching - 什么样的大数据框架可以实现毫秒级的数据转换?
- java - 转换设置
列出 在java中?