当前位置: 首页 > 科技观察

Socket开发框架的框架设计与分析

时间:2023-03-12 05:55:14 科技观察

虽然在APP应用、Web应用、Winform应用的大趋势下,越来越多的企业倾向于开发这些应用系统,但是在某些场合下Socket的应用是必不可少的,例如,一些停车场终端设备的接入、农业或水利设备的数据采集、压力监测等,以及常见的IM(即时通讯,如腾讯QQ、阿里旺旺等)客户端,都可以使用Socket框架用于相关的数据采集和信息通信目的,Socket应用程序可以作为APP应用程序、Web应用程序和Winform应用程序的补充。一、Socket应用场景一般情况下,客户端和服务端需要交换数据进行Socket连接,即后台提供数据查询或写入相关操作,其应用场景也由后台一个应用数据库支持.,如下。Socket服务器与客户端的通信原理如下。客户端通过服务器地址和端口发起Socket连接。服务端收到Socket客户端的请求后,打开一个新的Socket连接进行通信管理。双方基于Socket协议交换数据。交互处理。2、Socket框架设计思路Socket开发属于通信底层的开发。NET本身也提供了非常丰富的类来实现Socket的开发,高效使用。要想掌握或理解Socket开发,必须了解下面描述的场景和知识。TCPclient,连接server,进行数据通信TCPserver,负责监听client连接管理,比如登录,注销等,使用独立线程处理数据接收管理,负责数据接收,处理队列分发,使用一个独立的线程进行处理,简单处理后称之为“数据处理线程”。Content,可以封装以下功能的操作类,可以作为普通基类:BaseSocketClient,客户端基类,负责客户端的连接、断开、发送、接收等操作。BaseSocketServer,TCP服务器管理的基类,负责在独立线程中监听指定端口,如果有客户端连接,则做相应处理。BaseClientManager,连接客户端管理类,该类主要负责客户端登录超时处理、连接客户端维护、登录验证客户端维护、客户端登录验证接口、客户端发送数据处理等功能。BaseReceiver,数据接收处理类,该基类是所有接收数据的处理类,负责维护数据的队列关系,并进行进一步处理。ThreadHandler,一个数据无关的线程处理类,可以用一个独立的线程来处理每一种不同类型的数据(不同的协议类型)。这里封装了一个基类,用于处理独立的数据线程。1)Socket客户端基类我们知道,Socket通信分为客户端和服务端。他们处理的事情是不同的。因此,为了实现更好的代码复用,我们在此基础上进行了不同的封装。对于Socket客户端类,我们主要需要提供基本的Socket连接和断开、接收和发送、数据包解包等常规操作,所以我们封装了一个客户端基类BaseSocketClient。但是,为了实现基于不同应用客户端的不同业务通信,我们可以在服务端接收和处理不同的客户端,所以需要对Socket客户端进行扩展。比如这个框架增加了一个中心Socket客户端,分支的Socket客户端,以及桥接客户端(可以实现转发数据的功能)。2)Socket服务器基类是相对于Socket客户端基类而言的。我们还创建了一个套接字服务器基类。通过继承,我们可以简化代码的重复。服务器基类称为TCP服务器管理基类BaseSocketServer,负责在独立线程中监听指定端口,如果有客户端连接,则进行相应处理。同样,我们也派生了两个服务端基类,方便对不同的Socket客户端进行差异化处理。比如对应上面的中心客户端类ClientOfCall,我们添加一个对应的服务端类ServerForCall,其他类似,它们的继承关系如下。另外,由于我们允许访问不同的Socket客户端类(如ClientOfCall、ClientOfShop),因此在服务端也会有相应的Socket服务端类(ServerForCall、ServerForShop)来监听不同的端口。如果有Socket访问,服务器类会分配给不同的Socket客户端管理类来处理它们的关系和数据。这里会进一步引入客户端管理类的概念,对应不同的Socket客户端。这里根据需要还定义了一个Socket客户端管理基类BaseClientManager。这个T代表对应不同的客户端,这样我们就可以派生出两个不同的客户端管理类CallClientManager和ShopClientManager,它们的继承关系如下。3)数据接收和处理的基类不同的Socket客户端连接到服务端后,服务端新开一个线程进行对应的Socket数据通信,那么这里对数据通信的管理,我们可以为不同的Socket客户端定制一个对应的数据接收处理类,专门针对特定Socket客户端连接的数据进行处理。这里根据需要还定义了一个数据接收的基类BaseReceiver。同样,我们派生出几个对应不同客户端的具体数据处理类,如ReceivedForCall、ReceivedForShop、ReceivedForBridge。它们的继承关系如下。3、框架界面设计1)参数配置Socket服务器需要一些参数来确定监听的IP地址、端口、数据库连接信息,以及各种数据处理时间间隔。因此,需要提供一个更好的管理接口来进行管理,本框架采用基于本地配置文件的参数管理方式进行管理,参数接口如下。客户端还需要配置一些参数来确定要连接的服务器IP和端口信息,如下图配置界面。Socket服务器监控界面需要显示一些基本状态和Socket连接等基本信息,作为我们对整体状态的了解,这些信息可以记录在日志中,供我们查看和分析。除了上面的整体设计,还有一个地方需要详细介绍,就是Socket传输报文的封装和解包。在一般的Socket应用中,大多采用基于序列位置和字节长度来判断相关的方法,这些过程对于我们分析复杂的协议内容来说是一场灾难。一旦协议位置发生变化或需要特殊处理,就非常容易出错,而且大部分代码在很多位置都充满了数值变量。分析和理解是困难的。很不方便。如果我们对整体内容使用更灵活的消息格式,比如JSON格式,那么我们可以很好地将消息封装和消息拆包解析两部分拆分成第三方的JSON解析器。我们只需要关注具体的消息处理逻辑就够了,协议的扩展,就像JSON一样,可以自由灵活,让一瞬间,整个世界都安静下来。限于篇幅,我将在下篇介绍JSON格式的消息处理过程。除了上述场景,我们还需要考虑对用户消息的加密和校验,从而实现安全完整的消息处理。我们可以使用RSA公钥密码系统。平台通过发送平台RSA公钥消息将自己的RSA公钥告知终端,终端回复终端RSA公钥消息,反之亦然。这样,平台和终端的消息可以用自己的私钥加密,用对方的公钥解密。