繁体   English   中英

简单的聊天协议

[英]Simple chat protocol

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

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

现在我想实现客户端-客户端通信。

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

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

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

通常我不需要代码,我需要理论。 简单而简短。 也许教程?

我研究过XMPP。 它很重。 我只需要方向,我怎么能做到这一点。 我的目标是学习,而不是实施并忘记。

TCP 是基于 stream 的,这意味着在 TCP 的帮助下,您永远不会知道消息何时开始和结束。 任何消息/协议设计都需要解决这个问题。

有两种方法可以检测消息何时结束。 第一种方法是在消息末尾添加分隔符,第二种方法是在 header 中包含长度。

HTTP 两者都使用。 它使用空行来确定 header 何时结束。 在 header 中,它有一个 Content-Length header ,它告诉我们身体有多大。

对于二进制协议,我建议您使用固定长度 header ,其中第一个 integer (4 字节)是一个版本,第二个 integer 是正文长度。 通过这种方式,您可以轻松地在版本之间切换 header 布局(因为版本是第一个整数)。

对于文本协议,它实际上取决于消息内容的外观。 问题是内容可能不包含要使用的分隔符(如果您正在传输聊天消息,这可能会很困难)。 如果分隔符存在于实际聊天消息中,您当然可以转义它。 但恕我直言,更好的方法是使用像 HTTP 这样的标题/正文布局(因为它也很容易解析,您可以拥有 X 个标题而无需更改解析器)。

一条消息如下所示:

From: Arne
To: #ChannelName
WrittenAt: 2011-07-03 12:00 GMT
Content-Length: 16

This is a text

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

至于客户端-客户端通信,如果您是初学者,我将始终通过服务器 go。 这要容易得多,否则您必须确保至少有一个客户端不在路由器后面(否则将无法传递消息)。

如果是聊天室或用户,只需检查To header。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM