c# TcpClient - TcpListener服务器过载需要多少时间?

本文关键字:多少 时间 TcpClient TcpListener 服务器 | 更新日期: 2023-09-27 18:15:44

这个问题我已经想了很久了。

这是我的方案。通过无线连接到网络的笔记本电脑上的聊天服务器。现在,每个客户机总是请求和发送服务器必须解析的数据。平均包看起来像这样:

REQ_RM_LST|InfoHere

CLI_LIST|NameHere|NameHere|NameHere|NameHere|NameHere|NameHere|NameHere

这会把服务器搞乱吗?如,导致数据包丢失,数据丢失,数据包/请求甚至不被解析?如果是这样,为了产生这些问题,需要连接多少客户机并发送不同长度的类似数据?

谢谢!

c# TcpClient - TcpListener服务器过载需要多少时间?

平均数据包看起来像:

不,他们没有;有两个原因:

  • TCP只看到二进制,而不是文本-并且有几十种(数百种?)将文本编码为二进制的方法;当讨论套接字时,二进制文件才是最重要的
  • TCP是一个流,而不是一系列的数据包。在网络层,"包"是一个数据单位,但是在应用层你看不到——你只看到一个流。所以,如果你还没有在你的流中定义某种帧协议,那就等着痛苦吧

这会把服务器搞乱吗?

没有;为什么呢?

如,cause packet loss,

在网络层,这取决于TCP的实现;只要你的网卡/驱动是正常的。在应用层:这取决于你的代码。

数据丢失,数据包/请求甚至没有被解析?

再一次,到你的代码

如果是这样,为了产生这些问题,需要连接多少客户端并发送不同长度的类似数据?

这不是客户数量的一个因素;如果您的代码有bug,那么无论连接了多少客户端,它都有bug 。我的套接字服务器与成千上万个连接的客户端一起长时间运行——这不是问题。Stack Exchange网络的"实时更新"套接字服务器目前有126,815个连接的套接字(分布在几台服务器上,但这主要是为了部署弹性——即使在单个服务器实例上,我们也有非常高的数字),并且使用c#/. net套接字编写。

人们在套接字中最常犯的一个错误是期望发送方做:
Write({8 bytes});
...
Write({12 bytes});
...
Write({8 bytes});

并期望接收方得到 8,12,8字节。事实并非如此。只是一个流。接收方可以一次得到全部28个字节,也可以得到2,10,1,1,14个字节。所以你需要写一些框架协议。对于基于文本的协议,这通常是"读取直到您得到一个哨兵值,例如表示换行符的字节"。对于基于二进制的协议(哨兵值没有意义),这通常是一个长度前缀,例如"前4个字节是一个小端编码的32位整数,表示后续有效负载的长度"(注意,还有许多其他可能的编码方案)。

更多信息,请阅读http://marcgravell.blogspot.com/2013/02/how-many-ways-can-you-mess-up-io.html