网络编程实验报告

网络编程实验报告
网络编程实验报告

【实验目的】

掌握基于多线程并发服务器的基本设计框架和实现方法。

【实验性质】

综合性实验

【实验器材与所需软件】

计算机、交换机、windows操作系统、java集成开发环境

【实验学时】

8学时

【实验内容】

实现一个多线程并发服务器(服务器功能自选),要求该服务器可以体现出同时为多个客户端服务的特性。

【实验过程与步骤】

实验设计并实现了一个基于多线程并发服务器的网络聊天室工具。

1,需求分析:

工具采用了Client/Server结构,将聊天室划分为两个子程序:客户端子程序、服务器端子程序。

●客户端程序:

实现客户端与服务器端进行连接,并可与服务器端进行实时通讯。

●服务器端:

实现建立与多个客户端程序之间的连接,管理连接并能够通过多线程技术同时与多个客户端进行实时通讯。

2,系统设计:

系统的设计中,客户端与服务器端的连接,通过TCP/IP网络建立,并依托Socket进行实时通讯。系统中,各个模块之间的关系如下图所示:

上图中,显示同一服务器,通过网络可以同时与多个客户端程序建立连接并实现实时通讯功能,通讯流程如下图所示:

根据图示,客户端与服务器之间通过Socket()进行实时通讯,通讯步骤是:服务器监听、客户端发出请求、服务器接受、建立连接、交互通讯、关闭连接。另外,由于聊天室工具必须实现多客户端同时连接通讯的要求,因此,在服务器端设计时考虑采用多线程技术,每个服务器拥有多个服务线程,每个线程负责与一个客户端进行连接通讯,从而达到一个服务器同时与多个客户端并发通讯的效果。

3,系统实现:

在网络聊天室的最终实现时,设计服务器类、服务器线程类、客户端类以及系统界面类:

●服务器类 Class Server:

主要负责管理系统中的服务器线程,通过线程管理与客户端之间的连接及通讯,是服务器的主要管理端。

●服务器线程类 Class ServerThread:

线程类中,实现了具体的服务器与客户端之间一一对应的连接关系,并通过Socket与客户端进行实时通讯。

●客户端类 Class Client:

客户端类是通讯中的另一个主体,主要负责申请与服务器的连接,实现客户与服务器的交互。

系统界面类 Class Face:

系统界面类是系统的主类,封装了系统的主程序。Face类是直接与用户交互的,通过获取用户的需求,分别调用Server类或是Client类,是网络聊天室的直接主体。

【实验结果或结论】

网络聊天室主界面的运行效果如下图所示:

如上图所示,系统运行之后,自动获取主机的IP地址并显示在界面中的地址栏中,然后用户可以根据自己的需求设置端口号,点击服务器按钮之后,工具即成为聊天室服务器:

在建立服务器之后,用户可在另一个界面中,输入服务器IP地址、端口号,并点击客户端按钮发起连接申请:

连线成功之后,客户端和服务器端就可以开始实时通讯,通讯效果图如下图所示:

【实验中遇见的问题及其解决方案】

在最初实现多客户端与服务器同时进行实时通讯时,发现所有客户端发出的信息服务器都能很好的在一时间收到,但是服务器发出的信息只有最近一个连接到服务器的客户端才能收到,经过研究分析发现通过TCP/IP网络建立的Socket 连接,只能实现一一对应的通讯,也就是在新的客户端建立连接时,服务器与之前客户端建立的连接已经中断,因此发出的信息只有最近连接的客户端才能收到。因此,在原有设计的基础上,引入了多线程技术,在服务器端建立服务器线程池,每个线程都与客户端建立一一对应的连接,确保了服务器的信息第一时间发送到所有连接的客户端中。

【实验总结与收获】

通过本次试验,掌握了多线程并发服务器的设计思想,通过自己动手设计并实现的网络聊天室小工具,大大增强了自己的动手能力。同时,通过实验,进一步熟悉了JAVA开发环境。为了实现系统功能,深入研究了Socket基本原理及使用方法,积累了一定的JAVA语言网络编程经验。

在系统的实现中,也遇到了种种问题,在对各种问题的排查之中,增加了自己对系统程序的测试能力。在发现问题、解决问题的过程中,大大增强了自己对使用的编程语言、网络技术相关知识理解与认识,为今后从事相关工作垫下了坚实的基础。

【实验作业】

简述线程池的基本原理。

线程池的引入,主要是减少系统频繁的执行创建线程、销毁线程的操作,从而提高系统资源利用率,大大提高系统运行效率。一个线程池包括以下四个基本组成部分:

①线程池管理器(ThreadPool):用于创建并管理线程池,包括创建线程池,销毁线程池,添加新任务;

②工作线程(PoolWorker):线程池中线程,在没有任务时处于等待状态,可以

循环的执行任务;

③任务接口(Task):每个任务必须实现的接口,以供工作线程调度任务的执行,它主要规定了任务的入口,任务执行完后的收尾工作,任务的执行状态等;

④任务队列(taskQueue):用于存放没有处理的任务。提供一种缓冲机制。

相关主题
相关文档
最新文档