請問,你接收的代碼是什麽?TcpClient似乎並不存在每秒接收一次這種情況。

解决方案 »

  1.   

    看不明白TcpClient建立的是有连接的通道,你可以使用stream来处理,数据肯定丢不了
      

  2.   

    我的确是用Stream来处理啊,我启一个线程,不断的接收数据,代码片断:while (!blnStop)
    {
    if (stream.CanRead)
    { byte[] bytes=new byte[tcpClient.ReceiveBufferSize]; if (stream.DataAvailable==true)
    {
    int intCount=stream.Read(bytes, 0, (int)tcpClient.ReceiveBufferSize); this.lblReceiveCount.Text =Convert.ToString(Convert.ToInt16(this.lblReceiveCount.Text) +1); Console.WriteLine(System.Text.Encoding.ASCII.GetString(bytes,0,intCount)+"\n"); }

    }}我发现主机在20秒内发送了1000笔数据,而我实际接收了40次,花了2分钟,数据似乎没有丢失.
    但是主机是时时刻刻在发送的,接收速度至少要和它的发送速度相当吧.
      

  3.   

    tcp是基于流协议的,它只能保证可靠数据传输,不能保证主机和客户端的收发一致,如果要求严格同步的话用udp
      

  4.   

    接收的速度一定程度上受buffer大小的影響,
    byte[] bytes=new byte[tcpClient.ReceiveBufferSize];你適當增加這個數組的大小看看,寬帶的話,建議50K以上。這樣循環的次數就要減少很多,所以如果數據大的話也會快很多,但内存消耗也因此會增大。
    byte[] bytes=new byte[51200];
    接收的時候:
    int intCount=stream.Read(bytes, 0, 51200);
      

  5.   

    To qzj(SoldierQ):
    我试过了,改变缓存大小,并不能解决这个问题,不过是每次接收的间隔增大,但是总时间仍然大大超过远端主机(使用vb的winsock的send的方法,不停发送)的发送时间.明明主机的send方法已经把很多数据都发送了(20秒),但是客户端接收确用了2分钟才接收完,我的困惑是既然建立的TCP/IP连接,如果客户方的接收速度没那么快,主机如果无视客户方速度,如何保证数据能不丢失呢?
      

  6.   

    明明主机的send方法已经把很多数据都发送了(20秒),但是客户端接收确用了2分钟才接收完,我的困惑是既然建立的TCP/IP连接,如果客户方的接收速度没那么快,主机如果无视客户方速度,如何保证数据能不丢失呢?
    ----------------------------------------------------------------------------------------server在发数据的时候,client会把本地的缓冲区大小告诉server, server每发一个数据包,client就会把可用的buffer告诉server.
    具体详细请看tcp/ip窗口滑动
      

  7.   

    原因: 1 可能你的缓冲区设的小
    2 我使用下面的方法,很快啊,就是在这个线程里还做了好多工作,比如检测数据合法性都很快的
    是不是System.Text.Encoding.ASCII.GetString(bytes,0,intCount)的原因?

    StringBuilder strRecvBuf; //to store data receive from server
    strRecvBuf = new StringBuilder(8192);
    while( _stream != null && !blnStop)
    {
    Byte[] ReceiveByte = new Byte[81912];
    try
    {
    iNum = _stream.Read( ReceiveByte, 0, 8192 );
    }
    catch(Exception e)
    {
    //TODO:
    }
    if ( iNum <= 0 )
    {
    //TODO:
    }

    strRecvBuf.Append ( Encoding.Default.GetString ( ReceiveByte, 0, iNum ) );

    strReceive = strRecvBuf.ToString();
    iPos = strReceive.IndexOf("\r\n");
    if ( iPos >= 0 )
    {
    strRecvBuf.Remove ( 0, iPos+2 );
    strReceive = strReceive.Substring ( 0, iPos );
    }
    Console.WriteLine(strReceive);
    }//end while
      

  8.   

    Q:主机如果无视客户方速度,如何保证数据能不丢失呢?A:使用一个ArrayList作为队列接收数据,你可以使用事件或者投递消息的方式通知主线程,
    主线程再去这个队列中去取,不要把处理全部放到接收线程里,接收线程专门管接收,这样速度
    会大大提高的,使用AutoResetEvent很方便的,或者override void DefWndProc(ref System.Windows.Forms.Message m)函数使用消息,让主线程从队列中取数据,很快的。
      

  9.   

    To simonzone(年年岁岁花相似,岁岁年年人不同) 
    这是TCP/IP底层保证数据不丢失的规则,但是主机在不断发送数据到客户机的端口,应该存在一个缓存区的最大值,如果发送速率大于接收速率,缓存区最后会溢出,造成数据丢失.是否是这样?To wxlifeng(SharpLee) 
    我明白你的意思,我在该线程中只是接收以后打印在输出窗口,没有做别的事情.
      

  10.   

    问题已经解决,没想到就是Console.Writeline的问题.通过调试发现这句话花费了很大的时间,去掉以后速度就非常快了,几乎和主机同步.谢谢各位.