简单的聊天协议

Tig*_*yan 0 sockets networking tcp

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

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

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

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

下一步是单击按钮,它将组成一个Socket并发送,然后服务器应该了解谁是被寻址的消息.

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

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

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

jga*_*fin 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
Run Code Online (Sandbox Code Playgroud)

请注意,长度为16,这是因为新行包含在正文中.

对于客户端 - 客户端通信,如果您是初学者,我将始终通过服务器.它更容易,因为否则您必须确保至少有一个客户端不在路由器后面(或者无法传递消息).

只需检查To标题是否适用于聊天室或用户.