目的是读取网络流中的全部数据,如下代码:
Code
do
{
buffer = new byte[500];
bytes = g_Stream.Read(buffer, 0, buffer.Length);
}
while (g_Stream.DataAvailable);
通过DataAvailable来判断是否有数据,然而发现这个属性有延时性,即如果我断点调试的时候是可以读取全部数据的,如果直接运行会返回false。这样我只能读取第一次do运行读取到的数据了。
请高手帮忙解决一下!网络上实在搜索不到办法。
while (g_Stream.DataAvailable);肯定是有问题的
当程序处理完bytes = g_Stream.Read(buffer, 0, buffer.Length);之后
g_Stream.DataAvailable不一定是true的
而且考虑到网络的延迟,从上一次数据到达到下一次数据到达时间间隔不确定,所以楼主的处理方式不正确
考虑一下异步读取吧
去掉while循环,用
g_Stream.BeginRead(_data, 0, _client.SendBufferSize, ReceiveMessage, null);替代
/// <summary>
/// 异步接收消息
/// </summary>
/// <param name="ar"></param>
private void ReceiveMessage(IAsyncResult ar)
{
LastReceiveTime = DateTime.Now;
int bytesReading;
try
{
if (_client != null && _client.Connected == true)
{
lock (_client.GetStream())
{
bytesReading = _client.GetStream().EndRead(ar);
}
if (bytesReading < 1)
{
//移除客户端连接
}
else
{
//收到新消息
byte[] temp = new byte[bytesReading];
Array.Copy(_data, 0, temp, 0, bytesReading);
}
lock (_client.GetStream())
{
_client.GetStream().BeginRead(_data, 0, System.Convert.ToInt32(_client.ReceiveBufferSize), ReceiveMessage, null);
}
}
else
{
_log.Debug(string.Format("客户端{0}连接已经关闭",_clientIP));
}
}
catch (Exception ex)
{
_log.Debug("TCP异步接收数据异常",ex);
AllClients[_clientIP].CloseClient();
}
}
可以发下客户端请求连接的完整代码吗,求指导:
_client.GetStream().BeginRead(_data, 0, System.Convert.ToInt32(_client.ReceiveBufferSize), ReceiveMessage, null);
这里面 _data 是在这里面赋值的吗?
我日啊
楼上说的正确