Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.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# TcpClient与HttpWebRequest的性能比较_C#_Asp.net_Tcp_Httpwebrequest - Fatal编程技术网

C# TcpClient与HttpWebRequest的性能比较

C# TcpClient与HttpWebRequest的性能比较,c#,asp.net,tcp,httpwebrequest,C#,Asp.net,Tcp,Httpwebrequest,我正在将一个XML字符串发送到AIX框上的一个端口。我有两种连接到此框的方式(TcpClient和HttpWebRequest)。我有计时器,可以让我知道AIX盒处理我的请求和响应需要多长时间 TcpClient似乎比HttpWebRequest快100毫秒。我怀疑我的计时器位置可能不正确。无论哪种方式,我都不认为计时器的位置会造成响应时间上的如此大的差异 我的另一个想法是使用语句。也许他们保持连接打开的时间比TcpClient长 TcpClient方法是否更快 // TcpClient Tcp

我正在将一个XML字符串发送到AIX框上的一个端口。我有两种连接到此框的方式(TcpClient和HttpWebRequest)。我有计时器,可以让我知道AIX盒处理我的请求和响应需要多长时间

TcpClient似乎比HttpWebRequest快100毫秒。我怀疑我的计时器位置可能不正确。无论哪种方式,我都不认为计时器的位置会造成响应时间上的如此大的差异

我的另一个想法是使用语句。也许他们保持连接打开的时间比TcpClient长

TcpClient方法是否更快

// TcpClient
TcpClient client = new TcpClient(host, port);
DateTime x = DateTime.Now;
NetworkStream stream = client.GetStream();
NetworkStream stream = client.GetStream();
stream.Write(request, 0, request.Length);
stream.Flush();
while ((count = stream.Read(buffer, 0, buffer.Length)) > 0)
            response.Append(encoder.GetString(buffer, 0, count));
DateTime y = DateTime.Now;
totalMS = y.Subtract(x).TotalMilliseconds;


// HttpWebRequest 
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(URI);
using (Stream webStream = webRequest.GetRequestStream())
{
    webStream.Write(postdata, 0, postdata.Length);
    webStream.Close();
    DateTime x = DateTime.Now;
    using (WebResponse webresponse = webRequest.GetResponse())
    {
        webresponse.Close();
        DateTime y = DateTime.Now;
        using (Stream rs = webresponse.GetResponseStream())
        {
            using (StreamReader sr = new StreamReader(rs, Encoding.Default))
            {
                // Read response to end
            }
        }
    }
}
totalMS = y.Subtract(x).TotalMilliseconds;

只需使用System.Diagnostics.Stopwatch进行时间比较,就更准确了。

只需使用System.Diagnostics.Stopwatch进行时间比较,就更准确了。

很明显,他们在做不同的事情-您没有将任何数据发送到
TcpClient
,所以另一端肯定已经知道该怎么做了

WebRequest
版本中,您甚至发布了一些数据。。。为什么不需要
TcpClient
版本中的数据


基本上,看起来你不是在比较苹果和苹果。考虑到您正在与服务器讨论不同的协议,很可能是您的特定服务器直接使用
TcpClient
比使用简化协议更快。这与通常比较
HttpWebRequest
TcpClient
不同。您不能真正进行这样的一般性比较,因为HTTP从一开始就是在TCP上分层的。

很明显,它们在做不同的事情-您没有将任何数据发送到
TcpClient
,因此另一端必须已经知道该做什么

WebRequest
版本中,您甚至发布了一些数据。。。为什么不需要
TcpClient
版本中的数据


基本上,看起来你不是在比较苹果和苹果。考虑到您正在与服务器讨论不同的协议,很可能是您的特定服务器直接使用
TcpClient
比使用简化协议更快。这与通常比较
HttpWebRequest
TcpClient
不同。您不能真正进行这样的一般性比较,因为HTTP从一开始就是在TCP上分层的。

对于大多数事情来说,
TcpClient
会更快,因为
HttpWebRequest
必须做很多其他事情。。。例如,为HTTP请求构造头,并通过诸如分块请求之类的方式管理流连接。其中,
TcpClient
只是原始连接,没有内置所有HTTP标准。
TcpClient
对于大多数事情来说都会更快,因为
HttpWebRequest
必须做很多其他事情。。。例如,为HTTP请求构造头,并通过诸如分块请求之类的方式管理流连接。其中,
TcpClient
只是原始连接,没有内置所有HTTP标准。

我更新了TcpClient示例。我忽略了流写入。好吧,但它仍然不是真正的苹果对苹果,因为你只是在写一堆数据和读取一堆数据。您没有HTTP所需的任何头解析等。现在,如果需要对生成的数据执行此操作,则必须包含该数据。如果由于协议不需要它而不需要它,那么您实际上只是在显示direct协议实际上“更瘦”,这并不奇怪。我更新了TcpClient示例。我忽略了流写入。好吧,但它仍然不是真正的苹果对苹果,因为你只是在写一堆数据和读取一堆数据。您没有HTTP所需的任何头解析等。现在,如果需要对生成的数据执行此操作,则必须包含该数据。如果由于协议不需要它而不这样做,那么您实际上只是表明direct协议实际上“更瘦”,这并不奇怪。您的TCP客户端也在做HTTP post吗?如果不是,那么正如乔恩所说,你是在拿苹果和桔子做比较。即使您正在使用TCP客户端执行HTTP post,HttpWebRequest中也总会有TcpClient中不存在的开销。例如,HttpWebRequest将遵守HTTP协议,如果Expect100Continue=true,它将在发布数据之前等待最长350ms(或者更早,如果服务器发送100 Continue响应)。但是,您直接发布数据。因此,如果服务器在100毫秒后响应“Http/1.1 100 continue”,这就是延迟的原因。最好的方法是使用Wireshark比较两者之间的网络嗅探,看看是什么造成了差异。您的TCP客户端也在做Http post吗?如果不是,那么正如乔恩所说,你是在拿苹果和桔子做比较。即使您正在使用TCP客户端执行HTTP post,HttpWebRequest中也总会有TcpClient中不存在的开销。例如,HttpWebRequest将遵守HTTP协议,如果Expect100Continue=true,它将在发布数据之前等待最长350ms(或者更早,如果服务器发送100 Continue响应)。但是,您直接发布数据。因此,如果服务器在100毫秒后响应“Http/1.1 100 continue”,这就是延迟的原因。最好的方法是使用Wireshark比较两者之间的网络嗅探,看看是什么造成了差异。