sockets - 简单的聊天协议(protocol)

标签 sockets networking tcp

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

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

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

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

下一步是点击按钮,这将组成一个套接字并发送,然后服务器应该知道消息的地址。

那么,我的message结构应该是怎样的,在Server中我应该怎么理解,who addressed message呢?

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

我研究了 XMPP。它很重。我只需要方向,我该怎么做。我的目标是学习,而不是实现后忘记。

最佳答案

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

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

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

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

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

一条消息看起来像:

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

This is a text

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

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

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

关于sockets - 简单的聊天协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6593969/

相关文章:

c++ - Winsock 2,将变量压缩成一个字符串,发送出去,然后接收并读回

ios - PacketTunnelProvider 网络扩展未调用 Swift 3

objective-c - 提供回调函数作为特定的指针类型

linux - 为什么在没有调用 Close() 或 Shutdown() 时发送 RST?

performance - 当我的 Erlang TCP 代理收到许多并发请求时,为什么性能会下降那么多?

Python Socket 编程简单的 Web 服务器,尝试从服务器访问 html 文件

java - 将我的客户端 PC 重定向到默认登录页面

Python 套接字连接无法正常工作

c - 使用 CRIU 工具迁移特定的 TCP 连接

c - Netcat套接字编程