C# WebClient.DownloadString比TcpClient快12倍?
现在已经8个小时了,我还在想办法。代码示例将在VB.NET中提供,但我认为它们对于C#用户也是可读的。哦,我也接受C#解决方案 这最多需要50毫秒:C# WebClient.DownloadString比TcpClient快12倍?,c#,vb.net,sockets,webclient,networkstream,C#,Vb.net,Sockets,Webclient,Networkstream,现在已经8个小时了,我还在想办法。代码示例将在VB.NET中提供,但我认为它们对于C#用户也是可读的。哦,我也接受C#解决方案 这最多需要50毫秒: Dim Data as String = wc.DownloadString("x.com") 虽然这需要600毫秒的平均时间: Dim client As New Net.Sockets.TcpClient client.NoDelay = True client.Client.NoDelay = True client.Connect(IP,
Dim Data as String = wc.DownloadString("x.com")
虽然这需要600毫秒的平均时间:
Dim client As New Net.Sockets.TcpClient
client.NoDelay = True
client.Client.NoDelay = True
client.Connect(IP, 80)
Dim ns As Net.Sockets.NetworkStream = client.GetStream
Dim gbytes(70000) As Byte
ns.Write(rbytes, 0, rbytes.Length)
ns.Flush()
ns.Read(gbytes, 0, gbytes.Length)
Dim Data as String = System.Text.Encoding.ASCII.GetString(gbytes)
是的,我尝试过流读取器,不同的缓冲区大小包括小于或大于响应长度(约100000字节)。我使用的标题与WebClient使用的标题完全相同,也尝试了不同的标题。我也尝试过NoDelay的每一种组合
问题是,我不想使用
WebClient
和NetworkStream。Flush
在.NET中被评论为无用,所以有办法吗?这两种方法通过不同的机制获取相同的数据。我假设WebClient
的实现考虑了HTTP流量的性能,而TcpClient
的级别较低,因此没有针对任何特定场景进行优化。在ILSpy中打开System.Net.Http
,看看DownloadString
是如何实现的。我刚做了,信不信由你,底层的实现相当复杂。事实上,还有一种可能性:你有没有用WireShark之类的工具监控下载?嗯,ns.Write部分需要0.02毫秒。。。所以我认为问题从发送开始。此外,我还减少、增加甚至将SendBufferSize设置为与传出数据长度相同的长度。没有改进。您确定在TcpClient案例中下载了整个有效负载吗?您不检查.Read的返回值。我怀疑它比GB长度小得多。你应该一次又一次地读,直到.read返回零。我已经试着一个字节一个字节地读了。我确信它超过70000字节。但我试过读取512、1024、2048和许多其他数字,但没有任何变化。