我正在构建一个简单的客户端 - 服务器聊天系统。
客户端将数据发送到服务器,服务器将数据重新发送到所有其他客户端。我正在使用TcpListener和网络流类在客户端和服务器之间发送数据。
我需要发送的字段包括:名称,文本,时间戳等。我使用ASCII字符29将它们分开。
我也使用ASCII字符30来标记流数据的结束。
数据采用UTF8编码..
这是一个好方法吗?我会遇到问题吗?有更好的方法吗?
更新
可能我的问题被误解了,所以我解释得更好.. 假设有一个从客户端发送到服务器的数据列表,并假设只在一个流中发送所有数据,你如何发送这些数据?
答案 0 :(得分:7)
我没有分隔文本,而是发现很多对单个邮件的长度前缀更简单 - 所以而不是写
message [TERMINATOR]
你要写
[LENGTH] message
(以二进制形式发送长度,而不是文本 - 要么是固定长度的数字,例如4个字节,要么是可变长度的数字,如果你愿意牺牲简单性以便稍微减少传输数据的大小。)
然后,您可以轻松地从流中准确读取正确数量的数据,而无需担心过度进入下一条消息。唯一的缺点是你需要在开始发送之前知道消息的长度,但在这种情况下我不认为这对你来说应该是个问题。
顺便说一下,UTF-8是编码,而不是加密算法。
答案 1 :(得分:0)
我认为另一种选择可能是序列化/反序列化您的对象并使用.NET Remoting发送/接收它们。您还可以在发送时加密对象,并在接收时解密。
在The Code Project中我找到了一个包含源代码的小例子。