- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我尝试使用 TcpClient 发送/接收数据。我做了两个实验,发现了一些有趣的东西。
我在日本的服务器中设置了 TcpListener,在英国设置了 TcpClient。我一直向 TcpListener 发送 500 个字节,当 TcpListener 将 10KB 发送回 TcpClient 时。在每个实验中,我将此发送/接收循环保持 500 次。
实验一:
在每个发送/接收循环中,我创建一个全新的 TcpClient(创建前的时间)并发送/接收
实验二:
对于所有循环,我只有一个 TcpClient,它保持与 TcpListener 的连接并进行 500 次发送/接收。
结果:
一个循环的时间成本的平均值:
E1:1.8 秒,E2:0.49 秒。
这个结果让我很吃惊。所以保持连接以不断发送/接收可以节省很多时间???将近 2/3 的时间。
这是真的吗???
谢谢
====新的====
@Jon Skeet,@dbemerlin,感谢您的回复。我猜 Tcp 握手需要一些时间工具。
所以我做了实验3。
我设置一个 HttpListener 作为服务器并使用 WebClient 发送/接收,数据大小完全相同。每次我使用新的 WebClient 在英国和日本之间发送/接收时。
结果是 0.86(500 次循环的平均值,即发送/接收)。
我假设 WebClient/HttpLisener 本身就是 Tcp,对吗?在我的实验中,它们如何比原始 TcpClient/TcpListener 更快?
再次感谢
最佳答案
这并不特别令人惊讶,但这不是创建对象的成本 - 这是建立 TCP 连接、握手等的成本。
如果您可以在一个连接上完成大量工作,那比每次都建立一个新连接更有效率。用现实世界的术语来说,考虑两个人之间的电话交谈。
高效场景:你拨号码,他们接听,你说话,他们回复,你说话,他们回复等等。
低效场景:你调用号码,他们接听,你通话,他们回复,你挂断。然后您立即再次调用该号码,他们接听,您通话,他们回复,您挂断等等。
想象一下在现实中做后者!你会很快发疯的......
编辑:默认情况下,WebClient
将保持与 Web 服务器的挂起连接打开。如果您强制重置连接(基本上禁用 KeepAlive),那么您将再次看到缓慢的行为。
关于c# - TcpClient 的创建是否有很多开销?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2296440/
要关闭 TcpClient,必须关闭流。通常的做法是: client.GetStream().Close(); client.Close(); 因此仅使用 client
我正在阅读 the documentation on TcpClient.Close()并注意到这一点: Calling this method will eventually result in t
用于同步消息交换的我的客户端类: public class AsClient { private TcpClient connection; public AsClient(int s
我正在制作一个向许多 TCP 监听器发送数据的程序。如果不再使用其中一个 TCP 发送 channel ,我们是否需要使用 TCPClient.close 将其关闭。如果我们让它打开会怎样? 谢谢!
.NET 允许两种非常相似的方式从网络“读取”(假设 TCP 连接): 1. TcpClient.GetStream().Read() 2. TcpClient.Client.Receive() 通过
我找到了一些关于如何用 C# 编写 TCP/IP 客户端-服务器应用程序的代码服务器 Main 以此开头: TcpListener serverSocket = new TcpListener(888
我正在尝试连接到本地网络内的路由器。到目前为止,我已经使用了 TcpClient。 检查我的代码: public static void RouterConnect() {
服务器 : public class TcpServer { private TcpListener tcpListener; private static ManualResetEv
我想使用 TcpClient 发送 HTTP 请求。考虑以下代码: byte[] buf = new byte[1024]; string header = "GET
我在半关闭 TcpClient 时遇到了严重问题。我想做的是: 在客户端: 发送消息 关闭用于发送的底层套接字 收到回复 关闭用于读取的底层套接字(或者,此时,直接关闭它) 在服务器上: 接收消息 关
我有一个客户端和服务器,都有接收和发送方法,并且都使用相同的数据包类、数据包头大小和反序列化等。 如果我只发送较小的文本消息包,一切正常,但是当我尝试发送图像时,缓冲区溢出并且出现内存不足异常。奇怪的
在我的 C# 应用程序中,我有一个线程,它基本上不断地从 TcpClient 读取数据,直到被告知停止。为此,我使用 WaitHandles,例如: private ManualResetEvent
我有一个客户端-服务器程序。 我正在发送这样的数据: private void Sender(string s,TcpClient sock) { try { byte[] b
这个问题在这里已经有了答案: C# network connection running from shared drive (1 个回答) 关闭 7 年前。 我几天前问过类似的问题。那时,我正在尝
我有一个 TCPClient,它创建一个流,当 DataAvailable 时我从中读取流。 每 20 秒 !DataAvailable 我会使用 ACK 消息对套接字执行 ping 操作,以防止流关
我正在使用 SwifSockets:https://github.com/swiftsocket/SwiftSocket :按照有关如何使用它的说明后,我在堆栈溢出上找到了此代码:Sending Me
我在继承的一些代码中有一个奇怪的行为 - 下面的简化示例演示了如果内置到普通控制台应用程序中的问题。 WhoIs 在第 5 次调用时达到其使用限额 - 并返回一条消息 + 关闭套接字。使用 ReadL
我正在用 C# 开发一个 Tcp 客户端,我正在使用 TcpClient 类。我无法连接到服务器。 调试应用程序我可以看到对 Connect 的调用是成功的,但是在我这样做之后,我用 netstat
我有一个我似乎无法弄清楚的问题,请帮忙。我创建了一个类来处理使用 TcpClient 的某些硬件的接口(interface)。我希望此类在 HW 被销毁之前向 HW 发送最后一个命令。 为了解决这个问
您好,感谢您的帮助。这次想问一下TcpClient。我有一个服务器程序,我正在编写一个客户端程序。此客户端使用 TcpClient。首先是创建一个新客户端 clientSocket=new TcpCl
我是一名优秀的程序员,十分优秀!