我正在学习C#中的网络和线程。为此,我正在开发网络聊天。
目前,我在客户端 - 服务器(TCP)之间进行了基本通信。服务器可以使用多个客户端。但只有客户端 - 服务器通信。基本上,客户端将ASCII编码的消息发送到服务器,然后服务器对其进行解码并在控制台中显示。
到现在为止,我想实现客户端 - 客户端通信。
假设我们在每个客户端和消息框中都有客户端的在线列表,用于向每个客户端发送消息。
下一步是点击按钮,它将组成一个Socket并发送,然后服务器应该知道谁是被寻址的消息。
那么,什么应该是我的消息结构,以及我应该如何理解服务器,谁解决了消息?
一般来说,我不需要代码,我需要理论。简单而简短。也许是教程?
我已经研究过XMPP。这很重。我只需要指导,我该怎么做。我的目标是学习,而不是实现它并忘记。
答案 0 :(得分:5)
TCP是基于流的,这意味着在TCP的帮助下,您永远不会知道消息的开始和结束时间。任何消息/协议设计都需要解决这个问题。
有两种方法可以检测邮件何时结束。第一种方法是在消息的末尾添加分隔符,第二种方法是在标题中包含长度。
HTTP使用两者。它使用空行来确定标题何时结束。在标题中,它有一个Content-Length标题,用于说明正文的大小。
对于二进制协议,我建议你使用一个固定长度的头,其中第一个整数(4个字节)是一个版本,第二个整数是体长。通过这种方式,您可以轻松地在版本之间切换标题布局(因为版本是第一个整数)。
对于文本协议,它实际上取决于消息内容的外观。问题是内容可能不包括要使用的分隔符(如果您正在传输聊天消息,这可能很难)。如果它存在于实际的聊天消息中,您当然可以转义分隔符。但是imho更好的方法是使用像HTTP这样的标题/正文布局(因为它也很容易解析,你可以拥有X个标题,而不必更改解析器)。
消息如下:
From: Arne
To: #ChannelName
WrittenAt: 2011-07-03 12:00 GMT
Content-Length: 16
This is a text
请注意,长度为16,这是因为新行包含在正文中。
对于客户端 - 客户端通信,如果您是初学者,我将始终通过服务器。它更容易,因为否则您必须确保至少有一个客户端不在路由器后面(或者无法传递消息)。
如果是聊天室或用户,只需查看To
标题即可。