To qzj(SoldierQ): 我试过了,改变缓存大小,并不能解决这个问题,不过是每次接收的间隔增大,但是总时间仍然大大超过远端主机(使用vb的winsock的send的方法,不停发送)的发送时间.明明主机的send方法已经把很多数据都发送了(20秒),但是客户端接收确用了2分钟才接收完,我的困惑是既然建立的TCP/IP连接,如果客户方的接收速度没那么快,主机如果无视客户方速度,如何保证数据能不丢失呢?
To simonzone(年年岁岁花相似,岁岁年年人不同) 这是TCP/IP底层保证数据不丢失的规则,但是主机在不断发送数据到客户机的端口,应该存在一个缓存区的最大值,如果发送速率大于接收速率,缓存区最后会溢出,造成数据丢失.是否是这样?To wxlifeng(SharpLee) 我明白你的意思,我在该线程中只是接收以后打印在输出窗口,没有做别的事情.
{
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分钟,数据似乎没有丢失.
但是主机是时时刻刻在发送的,接收速度至少要和它的发送速度相当吧.
byte[] bytes=new byte[tcpClient.ReceiveBufferSize];你適當增加這個數組的大小看看,寬帶的話,建議50K以上。這樣循環的次數就要減少很多,所以如果數據大的話也會快很多,但内存消耗也因此會增大。
byte[] bytes=new byte[51200];
接收的時候:
int intCount=stream.Read(bytes, 0, 51200);
我试过了,改变缓存大小,并不能解决这个问题,不过是每次接收的间隔增大,但是总时间仍然大大超过远端主机(使用vb的winsock的send的方法,不停发送)的发送时间.明明主机的send方法已经把很多数据都发送了(20秒),但是客户端接收确用了2分钟才接收完,我的困惑是既然建立的TCP/IP连接,如果客户方的接收速度没那么快,主机如果无视客户方速度,如何保证数据能不丢失呢?
----------------------------------------------------------------------------------------server在发数据的时候,client会把本地的缓冲区大小告诉server, server每发一个数据包,client就会把可用的buffer告诉server.
具体详细请看tcp/ip窗口滑动
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
主线程再去这个队列中去取,不要把处理全部放到接收线程里,接收线程专门管接收,这样速度
会大大提高的,使用AutoResetEvent很方便的,或者override void DefWndProc(ref System.Windows.Forms.Message m)函数使用消息,让主线程从队列中取数据,很快的。
这是TCP/IP底层保证数据不丢失的规则,但是主机在不断发送数据到客户机的端口,应该存在一个缓存区的最大值,如果发送速率大于接收速率,缓存区最后会溢出,造成数据丢失.是否是这样?To wxlifeng(SharpLee)
我明白你的意思,我在该线程中只是接收以后打印在输出窗口,没有做别的事情.