【问题标题】:Simple chat protocol简单的聊天协议
【发布时间】:2011-07-06 09:08:00
【问题描述】:

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

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

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

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

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

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

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

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

【问题讨论】:

    标签: sockets networking tcp


    【解决方案1】:

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

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

    HTTP 两者都使用。它使用空行来确定标题何时结束。在标头中,它有一个 Content-Length 标头,说明正文有多大。

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

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

    消息如下所示:

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

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

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

    如果是用于聊天室或用户,只需检查 To 标头即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-17
      • 2012-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-06
      相关资源
      最近更新 更多