首页 新闻 会员 周边 捐助

关于NetworkStream的DataAvailable

0
悬赏园豆:50 [已解决问题] 解决于 2009-06-17 09:58

目的是读取网络流中的全部数据,如下代码:

Code
do
{
buffer
= new byte[500];
bytes
= g_Stream.Read(buffer, 0, buffer.Length);
}
while (g_Stream.DataAvailable);

 

通过DataAvailable来判断是否有数据,然而发现这个属性有延时性,即如果我断点调试的时候是可以读取全部数据的,如果直接运行会返回false。这样我只能读取第一次do运行读取到的数据了。

请高手帮忙解决一下!网络上实在搜索不到办法。

退休的程序员的主页 退休的程序员 | 初学一级 | 园豆:145
提问于:2009-06-07 21:15
< >
分享
最佳答案
0

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();
            }
        }

花生1 | 小虾三级 |园豆:872 | 2009-06-08 12:39

可以发下客户端请求连接的完整代码吗,求指导:
_client.GetStream().BeginRead(_data, 0, System.Convert.ToInt32(_client.ReceiveBufferSize), ReceiveMessage, null);
这里面 _data 是在这里面赋值的吗?

下雨天的马甲 | 园豆:200 (初学一级) | 2019-08-28 11:00
其他回答(2)
0

我日啊

魔鬼的主义 | 园豆:250 (菜鸟二级) | 2009-06-08 10:50
0

楼上说的正确

dwwwing | 园豆:661 (小虾三级) | 2009-06-08 19:49
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册