简单的聊天协议

时间:2011-07-06 09:08:01

标签: sockets networking tcp

我正在学习C#中的网络和线程。为此,我正在开发网络聊天。

目前,我在客户端 - 服务器(TCP)之间进行了基本通信。服务器可以使用多个客户端。但只有客户端 - 服务器通信。基本上,客户端将ASCII编码的消息发送到服务器,然后服务器对其进行解码并在控制台中显示。

到现在为止,我想实现客户端 - 客户端通信。

假设我们在每个客户端和消息框中都有客户端的在线列表,用于向每个客户端发送消息。

下一步是点击按钮,它将组成一个Socket并发送,然后服务器应该知道谁是被寻址的消息。

那么,什么应该是我的消息结构,以及我应该如何理解服务器,谁解决了消息?

一般来说,我不需要代码,我需要理论。简单而简短。也许是教程?

我已经研究过XMPP。这很重。我只需要指导,我该怎么做。我的目标是学习,而不是实现它并忘记。

1 个答案:

答案 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标题即可。