一个多线程socket作业
作业基本要求:使用Client/Server架构,设计和实现一个多线程字典服务器,能够将让并发的client从Server中查询单词、新增单词、删除单词和修改单词;系统的实现必须基于两个最基本技术(最底层最抽象的网络通信和并发控制技术):Java Socket和Java Thread;不能用其他序列化工具如:RMI、JMS;
#本实验使用C/S的系统架构,其中有一个字典Server启动等待一个或多个Client访问操作,如下图:
#因为在该实验的C/S架构中,进程的通信是通过TCP协议对传输信息进行封装,如果在通信的过程中不使用密文通信的话,是可以通过抓包软件(如Wireshark)对TCP报文结构的数据部分进行偷取。所以本实验中,基于java socket通信中使用DES对称加密方法对发送的信息进行加密通信,具有一定的安全性。其中TCP协议结构图、加密流程图等如下:
#在本实验的实践中,服务器端Socket面对每一个新接入的客户端Socket的时候会出现资源共享问题,那么需要对应的并发控制方法:线程模型设计,线程安全设计。在面对每一个client接入的请求中使用Worker-pool模型(如下图);其中线程模型设计在本实验中是使用JUI的线程池(Executors.newFixedThreadPool方法),默认一开始设定有限个线程的线程池给予新接入的client使用。使用线程池有以下好处,从而提高系统的吞吐量: 1、计算机资源有限,不能无限开线程给新接入的client使用; 2、线程的创建和销毁开销较大,设定一些已建立的线程在线程池中给client重用可以提高系统效率; 3、有相关的管理方法对线程池进行同一管理:如分配算法、监控方法等 如果多个线程对一个资源进行读写会出现线程安全问题,如:丢失修改、读“脏数据”,不可重复读等。在线程安全设计中,本实验使用单例模式+同步操作。首先为客户端服务器设计一个接口处理器(DictHandler.java),该类是单例模式,在整个server的声明周期中只能只能创建一个, 其方法是加上synchronized,只能一个线程对其进行访问操作,其他线程则等待,所以是线程安全的。 除此之外,本实验中在业务层也加入了对象线程池(apache common pool2),面对多个对象的创建可以更节省系统资源(DictHandlerPool.java)。
#本实验添加一个日志操作记录功能,任意的client接入server的所有请求都需要记录在系统中,记录信息包括(IP地址、端口号、请求接口、请求参数、请求结果)。其中使用AOP面向切面编程实现该日志功能:AOP则提供了一个名叫“横切”的技术,把影响多个类的公共行为封装到一个可重用的模块,并将其命名为“Aspect”,即“切面”。“切面”的用途把那些与业务无关,但被业务模块共同调用的程序和模块封装起来,提供一个公共模块,从而降低不同业务模块的耦合度,提高业务的可操作性和可维护性。横切关注点的主要业务如“权限认证”、“日志”、“事务”等。其中本实验将optLogSave抽象成AOP,如下图:
#因为本实验没有使用数据库存储字典数据和操作日志数据,选择以XML格式(dom4j)将数据存储在磁盘文件系统上;socket的通信数据格式则是使用json格式(fastjson)封装,再加密进行交互;
#分层编码包括:持久层、服务层、接口层、驱动层,单元测试等具体查阅代码;
#略
#本实验是简单多线程Socket通信实验,其中的设计包括: (1)线程模型使用woker-pool模型;线程安全控制使用单例模式+同步锁; (2)Socket通信为了提高安全性使用DES加密对TCP的数据报文部分加密; (3)使用JSON封装request和response再进行传输;使用XML格式对数据进行持久化操作; (4)新增一个操作日志记录功能,使用AOP面向切面编程思想实现;
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。