Sockets 简单聊天协议

Sockets 简单聊天协议,sockets,networking,tcp,Sockets,Networking,Tcp,我正在用C#学习网络和线程。为此,我正在开发网络聊天 目前我在客户机-服务器(TCP)之间有基本的通信。服务器可以与多个客户端一起工作。但是只有客户机-服务器通信。基本上,客户机向服务器发送ASCII编码的消息,然后服务器对其进行解码并在控制台中显示 现在我想实现客户端通信 假设我们在每个客户机中都有客户机的在线列表和用于向每个客户机发送消息的消息框 下一步是单击按钮,它将组成一个套接字并发送,然后服务器应该了解消息的地址 那个么,我的消息结构应该是什么,我应该如何理解服务器中的消息,消息的地址

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

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

现在我想实现客户端通信

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

下一步是单击按钮,它将组成一个套接字并发送,然后服务器应该了解消息的地址

那个么,我的消息结构应该是什么,我应该如何理解服务器中的消息,消息的地址是谁

一般来说,我不需要代码,我需要理论。简单而简短。也许是辅导课


我已经调查了XMPP。它很重。我需要的只是方向,我该怎么做。我的目标是学习,而不是实施和忘记。

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

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

HTTP同时使用两者。它使用空行来确定标头何时结束。在标题中,它得到了一个内容长度标题,它告诉我们主体有多大

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

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

消息如下所示:

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

This is a text
请注意,长度是16,这是因为新行包含在主体中

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


如果是针对聊天室或用户的,只需检查
To
标题即可

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

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

HTTP同时使用两者。它使用空行来确定标头何时结束。在标题中,它得到了一个内容长度标题,它告诉我们主体有多大

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

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

消息如下所示:

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

This is a text
请注意,长度是16,这是因为新行包含在主体中

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

如果是针对聊天室或用户的,只需检查
To
标题即可