作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在使用 NetworkStream.BeginRead/EndRead 从套接字进行异步读取。
但是,NetworkStream.EndRead() 有时会返回 0(即从套接字读取了 0 个字节),我认为这表明套接字已关闭,但事实并非如此,因为如果我继续调用 BeginRead() 最终我会收到更多数据。
这不是从套接字/NetworkStream 连续读取数据的正确循环吗?
void BeginContinousRead()
{
// Start the continous async read
mStream.BeginRead(mDataBuffer, 0, mDataBuffer.Length, new AsyncCallback(ProcessNetworkStreamRead), null);
}
private void ProcessNetworkStreamRead(IAsyncResult result)
{
// This will sometimes be zero?!
int bytesRead = mStream.EndRead(result);
// Continue reading more data and call this callback method again over and over, etc.
mStream.BeginRead(mDataBuffer, 0, mDataBuffer.Length, new AsyncCallback(ProcessNetworkStreamRead), null);
}
根据 MSDN,我应该使用 NetworkStream.DataAvailable 属性来确定套接字上是否有更多数据可用,但即使稍后可能会有更多数据到达,这也将为 FALSE。
例如,根据 MSDN 这应该是我的回调:
private void ProcessNetworkStreamRead(IAsyncResult result)
{
// This will sometimes be zero?!
int bytesRead = mStream.EndRead(result);
while (mStream.DataAvailable)
mStream.BeginRead(mDataBuffer, 0, mDataBuffer.Length, new AsyncCallback(ProcessNetworkStreamRead), null);
}
...但这不能正常工作,因为 DataAvailable 变为 FALSE,然后我的连续读取停止并且不再读取任何数据。
在另一端关闭套接字或我选择关闭套接字之前继续读取数据的正确异步方法是什么?
最佳答案
不是检查 bytesRead 或 DataAvailable 属性来检查套接字是否关闭,而是包装对 BeginRead 的调用并捕获 IOException。然后应该会告诉您套接字是否已关闭。
关于.net - 为什么即使在 NetworkStream.EndRead 返回 0 字节后我仍然接收数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9806494/
我是一名优秀的程序员,十分优秀!