Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WebClient.DownloadString比TcpClient快12倍?_C#_Vb.net_Sockets_Webclient_Networkstream - Fatal编程技术网

C# WebClient.DownloadString比TcpClient快12倍?

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,

现在已经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, 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和许多其他数字,但没有任何变化。