新人, socket如何循环接收数据? 对方发过来有70000  字节 现在每次只能收1500字节。 如何循环接收。 最好有代码 谢谢!

解决方案 »

  1.   

    Socket Client = new Socket(endpoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);if (Client.Available < pgsize)
                {
                    rds = Client.Receive(InBuffer2);
                }
    这个写法对吗?
      

  2.   

    Receive 或 BeginReceiveEndReceive
      

  3.   

    byte[] buff = new byte[1500];int bytesReceived = 0;
    do
    {
         int n = socket.Receive(buff, 0 , buff.Length, SocketFlags.None);
         bytesReceived += n;
    }
    while(bytesReceived < 70000);
      

  4.   

    whie(true)
    或者异步BeginReceive
      

  5.   

    Moon1(静静的黎明) 的是对的--------------------------------------------------------------------------------
    专注于自动提交,如发贴机资源采集器等网络营销软件的开发及相关领域如验证码识别技术。  
    QQ群号:24733057
      

  6.   

    Moon1(静静的黎明) 的方法用了, 还是接收数据不全。 实际接收68000多字节
      

  7.   

    试下,如果还不行,也顺带检查下你的程序的发送端byte[] buff = new byte[1500];int bytesReceived = 0;do
    {
         int bytesToRead = 70000 - bytesReceived;
         int n = socket.Receive(buff, 0 , Math.Min(bytesToRead, buff.Length), SocketFlags.None);
         bytesReceived += n;
    }
    while(bytesReceived < 70000);
      

  8.   

    if (Client.Available>0)
    {
         rds = Client.Receive(InBuffer2);
    }
      

  9.   

    只接受到后面?
    我估计是你没利用好那段代码,我添个变量string msg = "";
    byte[] buff = new byte[1500];int bytesReceived = 0;do
    {
         int bytesToRead = 70000 - bytesReceived;
         int n = socket.Receive(buff, 0 , Math.Min(bytesToRead, buff.Length), SocketFlags.None);     //在这里把当次接受的数据+起来。 我用的是ASCII,根据你的具体情况更改编码     msn += System.Text.Encoding.ASCII.GetString(buff, 0, n);     bytesReceived += n;
    }
    while(bytesReceived < 70000);Console.WriteLine(msg);
      

  10.   

    兄弟我也做过几个Socket方面的东东,有不少体会,最好的方法是用Socket的异步功能.比如:public void SetupRecieveCallback( Socket sock )
    {
        try
        {
            AsyncCallback recieveData = new AsyncCallback( OnRecievedData );
            sock.BeginReceive( m_byBuff, 0, m_byBuff.Length, 
                               SocketFlags.None, recieveData, sock );
        }
        catch( Exception ex )
        {
            MessageBox.Show( this, ex.Message, "Setup Recieve Callback failed!" );
        }
    }public void OnRecievedData( IAsyncResult ar )
    {
        // Socket was the passed in object
        Socket sock = (Socket)ar.AsyncState;    // Check if we got any data
        try
        {
            int nBytesRec = sock.EndReceive( ar );
            if( nBytesRec > 0 )
            {
                // Wrote the data to the List
                string sRecieved = Encoding.ASCII.GetString( m_byBuff, 
                                                             0, nBytesRec );            // WARNING : The following line is NOT thread safe. Invoke is
                // m_lbRecievedData.Items.Add( sRecieved );
                Invoke( m_AddMessage, new string [] { sRecieved } );            // If the connection is still usable restablish the callback
                SetupRecieveCallback( sock );
            }
            else
            {
                // If no data was recieved then the connection is probably dead
                Console.WriteLine( "Client {0}, disconnected", 
                                   sock.RemoteEndPoint );
                sock.Shutdown( SocketShutdown.Both );
                sock.Close();
            }
        }
        catch( Exception ex )
        {
            MessageBox.Show( this, ex.Message, "Unusual error druing Recieve!" );
        }
    }给你个8错的文章,是E文,带源代码(上边的代码是其中一部分):http://www.codeproject.com/cs/internet/socketsincs.asp异步功能还有一个好处是.NET底层的Socket类库在你用异步时可以聪明到最大限度地利用通讯硬件上的线程和资源,对节省CPU资源很有帮助.
      

  11.   

    Moon1(静静的黎明)  确实是没有累加字符。现在还有个问题, 服务器是发过来一个xml文件,文件里是有这个文件的大小比如是70000,  我在接收前怎么知道这个文件的大小70000呢?
      

  12.   

    通常发Socket的包时都有一定的格式,比如你打算发一个XML文件,也不是直接就把它发出去,需要定义一个消息包的头 (不是包头啊 ^_^ ) 的格式,其中包括这个消息包有多长,起始特殊字符是什么等一系列信息. 而那个XML文件是跟随在那个头后边的内容.
      

  13.   

    <?xml version="1.0" encoding="GB2312" ?> 
    - <RESPONSE>
      <PAGESIZE>001233</PAGESIZE> 这是发过来xml文件的头部这个就是包的大小,如何截去呢?
    - <HEADER>
      <COMMAND>QUERY</COMMAND> 
      <QUERYID>32163975</QUERYID> 
      </HEADER>
    - <BODY>。。
      

  14.   

    还是先收<?xml version="1.0" encoding="GB2312" ?> 
    - <RESPONSE>
      <PAGESIZE>001233</PAGESIZE> 这段然后取得pagesize 再往下收
      

  15.   

    <?xml version="1.0" encoding="GB2312" ?> 
    - <RESPONSE>
      <PAGESIZE>001233</PAGESIZE>上边这些不能算是包头, 它们已经是XML 里边的内容了,我说的包头是指在XML只外的.从Socket接受来的原始数据都是Byte,通常的包头都是用Byte的最前几位.比如: 00 是特征字,代表一个包开始,然后两位 XX 代表整个包的Byte数目, 然后就是正式的XML文件.接收的时候先查头两个 Byte, 如果是 00 就是一个包的开始,然后查包的大小......
      

  16.   

    用Socket接收和发送数据,楼主应该补一补,《程序员秘书》有很多现存精简的源代码
    详见:http://www.psec.net.cn
      

  17.   

    to RedGoldFish(红金鱼):给你个8错的文章,是E文,带源代码(上边的代码是其中一部分):http://www.codeproject.com/cs/internet/socketsincs.asp异步功能还有一个好处是.NET底层的Socket类库在你用异步时可以聪明到最大限度地利用通讯硬件上的线程和资源,对节省CPU资源很有帮助.强烈感谢哈!!!!!!要的就是这个!!!!!谢谢!!!!
      

  18.   

    luckids(阿七仔)你客气了, 只要兄弟们觉得有点儿帮助俺就算没瞎忙.
      

  19.   

    谢楼主送分.外加一句,做SOCKET通讯最麻烦的就是把接收的Byte[] 转换成真正的信息,比如一个XML文件,要占到整个代码的60%以上.要做到不丢数据并且效率高,里边有不少细活儿,涉及到多线程等很多东东.