解决方案 »

  1.   

    我表达错了,我说的死循环是想表达这样一个意思:
    就是我BeginReceive读了的数据,第二次读为什么还能把之前的数据都读出来。。我是用Available属性或者EndReceive值来标记应该该读多少数据
    客户端用tcpclient的Available都能达到目的
      

  2.   

    没人舍得看一眼呀,就是想问问为什么这段代码中,已经读取了的数据,之后还能读出来,感觉就是缓存没清空一样或者指针没移动一样
    举个列子
    客户端发送数据                  服务端接收数据
    AAAA                                     AAAA
    BBBB                                    AAAABBBB
    依次类推
    而且,假如客户端只发送一次数据,回调中的Console.WriteLine(str);会无休止执行下去,Available 永远不为0
     private static void ReceiveCallBack(IAsyncResult ar)
            {
                var stateObject = ar.AsyncState as StateObject;
                int readlength = stateObject.CurrentSocket.EndReceive(ar);
                //if (readlength > 0)
                //{
                //    string str = Encoding.GetEncoding("gb2312").GetString(stateObject.buffer, 0, stateObject.CurrentSocket.Available);
                //    Console.WriteLine(str);
                //}
     
                //这里是死循环。。不加这个,连接成功后,客户端只有第一次发送数据能回调,而且readlength还是0,之后客户端再发送数据就不会回调了
                if (stateObject.CurrentSocket.Poll(-1, SelectMode.SelectRead))
                {
                    stateObject.CurrentSocket.BeginReceive(stateObject.buffer, 0, stateObject.CurrentSocket.Available, SocketFlags.Peek, new AsyncCallback(ReceiveCallBack), stateObject);
                    if (stateObject.CurrentSocket.Available > 0)
                    {
                        string str = Encoding.GetEncoding("gb2312").GetString(stateObject.buffer, 0, stateObject.CurrentSocket.Available);
                        Console.WriteLine(str);
                    }
                }
            }
      

  3.   

    娘的,被那博客误导了,下面这个就ok了,持续接后续数据,因为是长连接嘛。
    那poll是干啥的安?msdn看了没看懂喃,哪种情景用这玩意儿private static void ReceiveCallBack(IAsyncResult ar)
            {
                var stateObject = ar.AsyncState as StateObject;
                int readlength = stateObject.CurrentSocket.EndReceive(ar);
                if (readlength <= 0)
                {
                    stateObject.CurrentSocket.BeginReceive(stateObject.buffer, 0, stateObject.CurrentSocket.Available, SocketFlags.None, new AsyncCallback(ReceiveCallBack), stateObject);
                }
                else
                {
                    string str = Encoding.GetEncoding("gb2312").GetString(stateObject.buffer, 0, readlength);
                    Console.WriteLine(str);
                    stateObject.CurrentSocket.BeginReceive(stateObject.buffer, 0, stateObject.CurrentSocket.Available, SocketFlags.None, new AsyncCallback(ReceiveCallBack), stateObject);
                }
                
                //if (readlength > 0)
                //{
                //    string str = Encoding.GetEncoding("gb2312").GetString(stateObject.buffer, 0, stateObject.CurrentSocket.Available);
                //    Console.WriteLine(str);
                //}            //这里是死循环。。不加这个,连接成功后,客户端只有第一次发送数据能回调,而且readlength还是0,之后客户端再发送数据就不会回调了
                //if (stateObject.CurrentSocket.Poll(-1, SelectMode.SelectRead))
                //{
                //    stateObject.CurrentSocket.BeginReceive(stateObject.buffer, 0, stateObject.CurrentSocket.Available, SocketFlags.Peek, new AsyncCallback(ReceiveCallBack), stateObject);
                //    if (stateObject.CurrentSocket.Available > 0)
                //    {
                //        string str = Encoding.GetEncoding("gb2312").GetString(stateObject.buffer, 0, stateObject.CurrentSocket.Available);
                //        Console.WriteLine(str);
                //    }
                //}
            }
      

  4.   

    http://blog.csdn.net/jnu_simba/article/details/9042467http://www.2cto.com/net/201310/250365.html
      

  5.   

    http://wenku.baidu.com/view/694d42360b4c2e3f57276356.html