# DistSocketServer **Repository Path**: huang-guoquan-123456654321/dist-socket-server ## Basic Information - **Project Name**: DistSocketServer - **Description**: 一个多线程socket作业 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-04-24 - **Last Updated**: 2023-06-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # DistSocketServer 一个多线程socket作业 ## 实验目的与计划 1. 熟悉分布式系统与分布式计算原理; 2. 通过java编程实践,了解服务器间的通信原理,以及并发情况下资源管理方法; 3. 通过调研,了解软件设计和软件工程的相关方法,其中包括面向对象建模方法,设计模式,单元测试方法等; ## 功能需求 作业基本要求:使用Client/Server架构,设计和实现一个多线程字典服务器,能够将让并发的client从Server中查询单词、新增单词、删除单词和修改单词;系统的实现必须基于两个最基本技术(最底层最抽象的网络通信和并发控制技术):Java Socket和Java Thread;不能用其他序列化工具如:RMI、JMS; ## 系统设计 #### 系统模型 #本实验使用C/S的系统架构,其中有一个字典Server启动等待一个或多个Client访问操作,如下图: ![image1](https://gitee.com/huang-guoquan-123456654321/dist-socket-server/raw/master/image/image1.png) #### 安全模型 #因为在该实验的C/S架构中,进程的通信是通过TCP协议对传输信息进行封装,如果在通信的过程中不使用密文通信的话,是可以通过抓包软件(如Wireshark)对TCP报文结构的数据部分进行偷取。所以本实验中,基于java socket通信中使用DES对称加密方法对发送的信息进行加密通信,具有一定的安全性。其中TCP协议结构图、加密流程图等如下: ![image1](https://gitee.com/huang-guoquan-123456654321/dist-socket-server/raw/master/image/image2.png) ![image1](https://gitee.com/huang-guoquan-123456654321/dist-socket-server/raw/master/image/image3.png) ![image1](https://gitee.com/huang-guoquan-123456654321/dist-socket-server/raw/master/image/image4.png) #### 线程模型 #在本实验的实践中,服务器端Socket面对每一个新接入的客户端Socket的时候会出现资源共享问题,那么需要对应的并发控制方法:线程模型设计,线程安全设计。在面对每一个client接入的请求中使用Worker-pool模型(如下图);其中线程模型设计在本实验中是使用JUI的线程池(Executors.newFixedThreadPool方法),默认一开始设定有限个线程的线程池给予新接入的client使用。使用线程池有以下好处,从而提高系统的吞吐量: 1、计算机资源有限,不能无限开线程给新接入的client使用; 2、线程的创建和销毁开销较大,设定一些已建立的线程在线程池中给client重用可以提高系统效率; 3、有相关的管理方法对线程池进行同一管理:如分配算法、监控方法等 如果多个线程对一个资源进行读写会出现线程安全问题,如:丢失修改、读“脏数据”,不可重复读等。在线程安全设计中,本实验使用单例模式+同步操作。首先为客户端服务器设计一个接口处理器(DictHandler.java),该类是单例模式,在整个server的声明周期中只能只能创建一个, 其方法是加上synchronized,只能一个线程对其进行访问操作,其他线程则等待,所以是线程安全的。 除此之外,本实验中在业务层也加入了对象线程池(apache common pool2),面对多个对象的创建可以更节省系统资源(DictHandlerPool.java)。 ![image1](https://gitee.com/huang-guoquan-123456654321/dist-socket-server/raw/master/image/image5.png) #### 日志模型 #本实验添加一个日志操作记录功能,任意的client接入server的所有请求都需要记录在系统中,记录信息包括(IP地址、端口号、请求接口、请求参数、请求结果)。其中使用AOP面向切面编程实现该日志功能:AOP则提供了一个名叫“横切”的技术,把影响多个类的公共行为封装到一个可重用的模块,并将其命名为“Aspect”,即“切面”。“切面”的用途把那些与业务无关,但被业务模块共同调用的程序和模块封装起来,提供一个公共模块,从而降低不同业务模块的耦合度,提高业务的可操作性和可维护性。横切关注点的主要业务如“权限认证”、“日志”、“事务”等。其中本实验将optLogSave抽象成AOP,如下图: ![image1](https://gitee.com/huang-guoquan-123456654321/dist-socket-server/raw/master/image/image6.png) #### 交互和存储模型 #因为本实验没有使用数据库存储字典数据和操作日志数据,选择以XML格式(dom4j)将数据存储在磁盘文件系统上;socket的通信数据格式则是使用json格式(fastjson)封装,再加密进行交互; ![image1](https://gitee.com/huang-guoquan-123456654321/dist-socket-server/raw/master/image/image7.png) ## 程序设计 #分层编码包括:持久层、服务层、接口层、驱动层,单元测试等具体查阅代码; ![image1](https://gitee.com/huang-guoquan-123456654321/dist-socket-server/raw/master/image/image8.png) ## 系统测试部署 #略 ## 总结 #本实验是简单多线程Socket通信实验,其中的设计包括: (1)线程模型使用woker-pool模型;线程安全控制使用单例模式+同步锁; (2)Socket通信为了提高安全性使用DES加密对TCP的数据报文部分加密; (3)使用JSON封装request和response再进行传输;使用XML格式对数据进行持久化操作; (4)新增一个操作日志记录功能,使用AOP面向切面编程思想实现;