【发布时间】:2010-08-16 22:55:22
【问题描述】:
我有一个 C# 服务器,它接受多个客户端,以及来自每个客户端的多条消息。
1- 为了从每个客户端开始读取,我需要传递一个缓冲区(字节),但问题是我不知道客户端要发送多少数据。那么有没有办法知道客户端要发送多少数据,以便我可以开始读取正确数量的数据?
2- 如果我只使用 1 字节数组从所有客户端读取,可以吗?还是我需要创建一个字节数组来从每个客户端读取?
【问题讨论】:
我有一个 C# 服务器,它接受多个客户端,以及来自每个客户端的多条消息。
1- 为了从每个客户端开始读取,我需要传递一个缓冲区(字节),但问题是我不知道客户端要发送多少数据。那么有没有办法知道客户端要发送多少数据,以便我可以开始读取正确数量的数据?
2- 如果我只使用 1 字节数组从所有客户端读取,可以吗?还是我需要创建一个字节数组来从每个客户端读取?
【问题讨论】:
除非您的协议规定要发送多少数据,否则不会。通常,您会读取一个缓冲区的值,然后可能会读取更多。不过,这实际上取决于协议。如果客户端只能在每个连接上发送一条消息,您通常会继续阅读,直到下一次调用返回 0 字节。否则,消息要么有分隔符,要么有长度前缀。
绝对不会 - 假设您要同时从多个客户端读取数据(为什么还要使用异步通信?)您最终会得到不同客户端的数据都被相互覆盖。为每个客户端创建一个新的字节数组。根据您对数据所做的具体操作,可能可以为同一个客户端的下一次读取重用相同的字节数组 - 如果您真的想要,您可以为以后的客户端重用字节数组...但不要同时从多个客户端读取到同一个缓冲区。
【讨论】:
那么有没有办法知道客户端要发送多少数据,以便我可以开始读取正确数量的数据?
任何协议都应该有一些机制让客户端指示何时完成发送数据,或者作为在实际数据之前发送的“长度”值,或者作为特殊的终止序列在数据之后发送。
如果我只使用 1 字节数组从所有客户端读取可以吗?还是我需要创建一个字节数组来从每个客户端读取?
取决于您的程序如何工作。如果您将同时拥有多个客户端,显然您不能只有一个缓冲区,因为它们最终会相互覆盖。如果是一个接一个的客户端,但一次只有一个,那么只有一个缓冲区是没有问题的。
【讨论】: