2010-08-16 107 views
0

我有一个C#服务器可以接受多个客户端和来自每个客户端的多条消息。C#==> Asyncsocket读取缓冲区?

1-为了从每个客户端开始读取,我需要传递一个缓冲区(字节),但问题是我不知道客户端要发送多少数据。那么有没有办法知道客户端要发送多少数据,以便我可以开始读取正确的数据量?

2-是否oK,如果我只使用1字节数组从所有客户端读取?或者我需要创建一个从每个客户端读取的字节数组?

回答

2
  1. 除非你的协议规定要发送多少数据,否则不会。通常你读一个缓冲区的值,然后读取更多。但它真的取决于协议。如果客户端只能在每个连接上发送一条消息,通常会继续读取,直到下一个调用返回0字节。否则,消息有分隔符或长度前缀。

  2. 绝对不是 - 假设您要同时从多个客户端读取数据(您为什么还要使用异步通信?),您最终会将不同客户端的数据全部写入对方。为每个客户端创建一个新的字节数组。根据你对数据的处理方式,可能能够重复使用相同的字节数组用于下一次读取同一个客户端 - 如果你真的想要的话,你可以重复使用字节数组,不会同时将多个客户端读入同一个缓冲区。

0

那么,有没有办法知道客户有多少数据要发送,这样我就可以开始阅读数据的正确量?

任何协议应该有某种机制用于客户端指示何时完成发送数据时,无论是作为被发送之前的实际数据,或因为这是一个特殊的终止序列的“长度”的值在之后发送的数据。

如果我只使用1个字节的数组从所有客户端读取是否是oK?或者我需要创建一个从每个客户端读取的字节数组?

取决于您的程序是如何工作的。如果你有多个同时的客户端,显然你不能只有一个缓冲区,因为他们最终会相互覆盖。如果它是一个接一个的客户,但一次只有一个客户,那么只有一个缓冲区没有问题。