1

我正在构建一个简单的客户端-服务器聊天系统。

客户端向服务器发送数据,服务器将数据重新发送给所有其他客户端。我正在使用 TcpListener 和 Network 流类在客户端和服务器之间发送数据。

我需要发送的字段是,例如:名称、文本、时间戳等。我使用 ASCII 字符 29 将它们分开。

我还使用 ASCII 字符 30 来标记流数据的结束。

数据采用 UTF8 编码。

这是一个好方法吗?我会遇到问题吗?有没有更好的方法?

更新:

可能我的问题被误解了,所以我解释得更好。假设有一个从客户端发送到服务器的数据列表,并且假设只在一个流中发送所有数据,你如何发送这些数据?

  • 使用标记
  • 使用字符作为分隔符
  • 为每个字段使用固定长度
4

2 回答 2

7

而不是分隔文本,我发现为单个消息添加长度前缀简单得多 - 所以而不是写

message [TERMINATOR]

你会写

[LENGTH] message

(以二进制而不是文本形式发送长度 - 可以是固定长度的数字,例如 4 个字节,或者如果您愿意牺牲简单性以略微减少传输的数据大小,则可以使用可变长度的数字。)

然后很容易从流中准确地读取适量的数据,而不必担心过冲到下一条消息中。唯一的缺点是您需要在开始发送之前知道消息的长度,但我认为在这种情况下这对您来说应该不是问题。

顺便说一句,UTF-8 是一种编码,而不是一种加密算法。

于 2010-03-07T13:28:15.427 回答
0

我认为另一种选择可能是序列化/反序列化您的对象并使用.NET Remoting发送/接收它们。您还可以在发送时加密您的对象,并在接收时解密。

代码项目中,我找到了一个带有源代码的小例子。

于 2010-03-07T14:33:55.270 回答