2.网络聊天程序的三种模式


实现一个网络聊天程序本应是最后一篇文章的内容,也是本系列最后的一个程序,来作为一个终结。但是我想后面更多的是编码,讲述的内容应该不会太多,所以还是把讲述的东西都放到这里吧。

当采用这种模式时,即是所谓的完全点对点模式,此时每台计算机本身也是服务器,因为它需要进行端口的侦听。实现这个模式的难点是:各个主机(或终 端)之间如何知道其它主机的存在?此时通常的做法是当某一主机上线时,使用UDP协议进行一个广播(Broadcast), 通过这种方式来“告知”其它主 机自己已经在线并说明位置,收到广播的主机发回一个应答,此时主机便知道其他主机的存在。这种方式我个人并不喜欢,但在 C#编写简单的聊天程序 这篇文章中,我使用了这种模式,可惜的是我没有实现广播,所以还很不完善。

第二种方式较好的解决了上面的问题,它引入了服务器,由这个服务器来专门进行广播。服务器持续保持对端口的侦听状态,每当有主机上线时,首先连接至 服务器,服务器收到连接后,将该主机的位置(地址和端口号)发往其他在线主机(绿色箭头标识)。这样其他主机便知道该主机已上线,并知道其所在位置,从而 可以进行连接和对话。在服务器进行了广播之后,因为各个主机已经知道了其他主机的位置,因此主机之间的对话就不再通过服务器(黑色箭头表示),而是直接进 行连接。因此,使用这种模式时,各个主机依然需要保持对端口的侦听。在某台主机离线时,与登录时的模式类似,服务器会收到通知,然后转告给其他的主机。

 

第三种模式是我觉得最简单也最实用的一种,主机的登录与离线与第二种模式相同。注意到每台主机在上线时首先就与服务器建立了连接,那么从主机A发往 主机B发送消息,就可以通过这样一条路径,主机A --> 服务器 --> 主机B,通过这种方式,各个主机不需要在对端口进行侦听,而只需要服务器进行侦听就可以了,大大地简化了开发。

而对于一些较大的文件,比如说图片或者文件,如果想由主机A发往主机B,如果通过服务器进行传输效率会比较低,此时可以临时搭建一个主机A至主机B之间的连接,用于传输大文件。当文件传输结束之后再关闭连接(桔红色箭头标识)。

除此以外,由于消息都经过服务器,所以服务器还可以缓存主机间的对话,即是说当主机A发往主机B时,如果主机B已经离线,则服务器可以对消息进行缓存,当主机B下次连接到服务器时,服务器自动将缓存的消息发给主机B。

本系列文章最后采用的即是此种模式,不过没有实现过多复杂的功能。接下来我们的理论知识告一段落,开始下一阶段――漫长的编码。

版权声明:本文为YES开发框架网发布内容,转载请附上原文出处连接
YES开发框架
评论列表

发表评论

评论内容
昵称:
关联文章

2.网络聊天程序模式
C# Socket网络编程 系列课程
Javascript对URL进行编码解码方式介绍
Python数组List检索 方法从数组List中检索出符合要求元素
快速删除node_modules文件夹方法
C# 多线程入门系列(
.Net 下高性能分表分库组件-连接模式原理
python四配置文件
LabVIEW生成.NETDLL——C#下调用NI数据采集设备功能方法 [原创www.cnblogs.com/helesheng]
01、收款播报机通用版本网络协议
2.客户端与服务端连接
数据绑定模式
VS制作C#程序windows安装程序
Webpack讲解:devTool中SourceMap模式详解
Task 使用详细[基础操作,异步原则,异步函数,异步模式]
获取URL参数方式
【C#】C#中使用GDAL3():Windows下编译插件驱动
winform 关闭form2同时显示form1
EFCore数据库提供程序
WPF程序级资源