文档库 最新最全的文档下载
当前位置:文档库 › java课程设计报告分析

java课程设计报告分析

JAVA课程设计报告学院:国际教育学院

专业:电子商务

姓名:马冲陈月月

指导老师:

程序设计课程设计报告书——局域网聊天系统

开发背景:

当今很多单位都组建了自己的局域网,有些单位不允许员工上班时网上聊天,故在局域网的出口网关上只开通80端口,这给一些工作时需要交流信息或传输文件的工作人员带来不便,他们很需要一个能在局域网内交流信息的聊天软件。还有现在大学生宿舍电脑的普及率很高,他们中有不少只接上了学校的局域网,而没有缴费上Internet网,因此他们也很需要一个局域网内的聊天件来交流信息。

开发目的:插上网线即可与同一局域网内用户聊天

功能要求:

i.打开程序自动搜索好友无需登录

ii.能够实现点对点单聊

iii.能够实现文件传输

iv.能动态更新在线用户列表

三、系统设计

3.1 设计思想

整个系统分为服务器和客户端,服务器端维护各个客户端的信息。客户端的所有信息发

往服务器端,再由服务器进行消息的分析处理并做出相应的控制,服务器端是所有信息的中心。服务器端可以查看所有用

户的聊天记录,监控所有用户的状态,发出用户上线、离线提示等公告,客户端则提供接收公告的功能。本课程设计按照系统的具体功能要求,首先应用Socket编程创建客户端和服务器端,每

多个客户端服务器端就会相因的创建一个线程,它们之间通过这个连接来实现数据通信;然后在客户端设置一个监听器,用于监听服务器发来的消息。并根据消息做出不同的动作。

3.2

系统功能

该系统实现了用户之间的点对点单人聊天,在线用户之间的群聊。为了加强之间的信息交流,还实现了用户之间文件传输、语音聊天。在客户端和服务器端都可以查看历史消息、保存消息、清空消息。为了监控用户之间的状态,服务器还可以实现踢掉用户的功能,同时用局域网聊天系统-2- 户时间文件传输的信息都会在服务器上显示。

3.3

系统架构

1)选择传输控制协议TCP使Java的Socket编程机制,分别建立客户端与服务器端、语音传输使用的是UDP控制协议;

2)分别设计客户端与服务器端的界面,并使用Java应用程序用户界面的开发工具包Swing进行窗体界面的布局,以及实现部分窗口事件的相应。

3.4 模块设计

3.4.1

服务器端:主要实现向各个客户端发布系统消息,接受来自客户端的各种信息并分别处理。具体功

能如下:

①连接控制:包括启动服务器、断开服务器以及断开某个客户端的连接;

②管理作用:包括对参与聊天者的昵称进行修改以及向所有或某个客户端发送消息,维护一个IP地址和昵称所对应的哈希表,以便定位到正确的客户端,且有权强制修改用户昵称;

③刷新列表:在有用户登陆或离开的时候实时更新列表,并将信息反馈到各个客户端;

④登陆信息:

检查用户是否已登陆,如登录,发消息通知所有用户。同时刷新在线用

户列表;

⑤聊天记录:能保存聊天记录,实现消息的保存、清空以及查看等功能;

⑥消息处理:解析客户端与服务器端的消息交互类型,做出相应处理,能够找到消息所对应的接收端。

3.4.2

客户端:主要实现向服务器端发布消息,并且对来自服务器的消息做出相应的响应。具体功能如下:

①连接功能:输入服务器地址,实现登录及断开功能

②登录设置:登录时,发送消息使服务器端获得相关登录信息,昵称及IP地址记录到服务器端维持的哈希表,断开后发送消息使IP地址及昵称从哈希表中删除;

③监听作用:实现对服务器发送过来的消息进行监听的功能;

④消息处理:接收由服务器端发送来的信息,并做出相应的响应;

⑤聊天记录:实现聊天记录的保存、清空以及查看等功能;

⑥消息处理:相应从服务器端接收到的消息交互类型,实现用户与用户之间的信息交互和文件交互;

⑦传输进度:使用进度条直观地表示用户与用户间文件交互的进度。

⑧文件传输:实现客户端之间的文件发送与文件的接收功能。

⑨语音聊天:实现客户端之间的语音聊天功能。局域网聊天系统

四、详细设计与实现

4.1

服务器端

4.1.1服务器

该段功能由Server.java文件中的Server类实现,具体实现过程下:①启动服务并接收连接:服务器的任务首先是建立一个由IP地址到昵称的映射的哈希表,用于存放用户的基本信息;启动服务器后,等候建立一个连接,然后用这个连接产生的Socket创建一个Client,同时检查该用户是否已存在哈希表中,若以存在,则提示该次连接请求失败,从而实现限制IP的目的;若不存在,则将该IP地址及其昵称或默认昵称的映射添加到哈希表中,接着服务器端向所有的用户发送管理信息,提示有新的用户登录,并且将刷新后的用户列表同时发送到各个客户端。

②关闭服务:服务器端遍历哈希表,关掉

每一个用户对应的Socket,之后,关闭服务Server。

③管理作用之发送消息:服务器端解析由客户端发送的请求,若控制字以“SPECIAL开头,则通过控制字后的昵称从哈希表中找到对应的用户,实现服务器端到客户端的点对点消息交互;若不是以“SPECIAL ”开头,则实现消息的广播发布。

④管理作用之修改昵称:首先判断新的昵称是否在哈希表中存在,

若已存在则给出错误提示,否则通过该用户的旧昵称在哈希表中查找到该用户,并用欲修改的昵称替换掉原昵称;接着刷新服务器端的用户列表显示,最后刷新客户端的用户列表显示。

⑤管理作用之断开连接:

若要断开某个客户端与服务器的连接,首先向该用户发送被管理

员请出系统的信息,然后通过该用户的昵称从哈希表中找到对应socket、service及IP地址等信息,再从每一项信息对应的列表里删除该用户的信息,最后关闭该用户的socket,同时刷新服务器端以及各个客户端的用户列表显示。

⑥在服务其中,需要同时处理多个客户端的请求,因此此处用到了多线程处理机制。在服务器程序里创建单个Server Socket,并调用accept()来等候一个新连接,一旦accept()返回,就取得结果获得的socket,并用它新建一个线程,令其只为那个特定的客户端服务,然后再调用accept (),等候下一次新的连接请求。

4.1.2 界面设计

该段功能由ServerFrame.java文件中的ServerFrame类实现,具体实现过程如下:

窗口布局:服务器端窗口使用了BorderLayout事务管理器,把整个容器分成了五个区域:North、South、East、West和Center,每个区域放置一个面板,每个面板又分别使用不同的事务管理器放置其他组件,如按钮、标签、文本框等,各个组将构成了一个完整的

服务器端界面。

①事件处理:通过Java的授权事件模型,针对组件send、Button1~Button8,通过addXXXListener(主要运用

了addActionListener)方法注册监听器,并且实现ActionListener接口中的actionPerformed方法,这样,当组件触发了相应类型的事件后,此事件就会被传送给已注册的监听器,事件监听器负责处理事件。至此,

局域网聊天系统实现了窗口对以下几个事件的响应:发送消息、保存消息清空消息、查看历史消息、启动服务、关闭服务、断开连接、修改昵称。

4.1.3功能函数

该段功能由ChatTookit.java文件中的ChatTookit类实现,具体实现过程如下:

①函数getAllNickname:该函数实现从IP地址——昵称对照哈希表中得到所有的昵称的功能,函数原型如下

public static String getAllNickname(Hashtable ip2nickna me)

②函数sendInfoToAll:该函数实现遍历所有已连接的客户端,并且发送输入的信息的功能,函数原型如下:

public static void sendInfoToAll(ArrayList onLineUsers,Strin

g info) throws IOException

③函数sendInfo:该函数实现给某个特定用户发送一条信息的功能,函数原型如下:

public static void sendInfo(Socket client,String info) throws IOException

④函数

getIP:该函数实现从socket中得到用户的ip地址的功能,函数原型如下:public static String getIP(Socket socket)

⑤函数getIP:该函数实现从一个hashtable中根据value得到key 的功能,函数原型如

public static String getIP(Hashtable ip2nickname,String nickname)

⑥函数getNickname:该函数实现从socket和IP地址——昵称对照hashtable中得到用户的昵称的功能,函数原型如下:

public static String getNickname(Socket socket,Hashtab le ip2nickname)

⑦函数updateOnLineUsersList:该函数实现将在线用户列表的显示清空,并用最新的用户列表更新客户端的用户列表,只显示昵称,函数原型如下:

public static void updateOnLineUsersList(List onLineUse rsList,String allNickname)

⑧函数

updateOnLineUsersList:该函数实现将在线用户列表的显示清空,并用最新的用户列表更新服务器端的用户列表:显示的是ip:昵称,函数原型如下:

public static void updateOnLineUsersList(List onLineUse rsList,Hashtable

ip2nickname)

⑨函数getSocketByIP:该函数实现根据用户ip地址得到该用户所在的socket功能,函数原型如下:

public static Socket getSocketByIP(ArrayList onLineUser s,String ip)

⑩函数getServiceByIP,该函数实现根据用户ip地址得到该用户所在的service功能,函数原型如下:

public static Service getServiceByIP(ArrayList allServi ce,String ip)

4.1.4

信息处理

客户端几乎所有信息都是交给服务器的Service负责接受这些信息,并且做出相应的处局域网聊天系统理。该段功能由Service.java文件中的Service类实现,实现过程如下:该类仍然是使用了Java的多线程处理机制,对为每一个登录的用户初始化一个Service,接着服务器端接收信息,将用户发过来的信息显示在服务器端面板上,并遍历发送给所有的客户端。此时,进行消息类型的判断:①若控制字以“NICKNAME:”开始,则表示该用户发出了一个修改昵称的请求,服务器端需要判断该昵称是否在哈希表中存在,如

若存在,则提示用户不能修改为此名字,否则更新该用户的资料,并且刷新服务器端和客户端的用户列表。

②若控制字以“SPECIAL:”

开头,则表示该用户发出了一个需要同某一用户私聊的请求,此时服务器端通过控制字头的后的昵称,找到接收端用户的信息,并对其发出私聊的信息,实现点对点的消息交互。

③若控制字以“FILE:”开始,则表示该用户发出了一个对某一客户端发送文件的请求,此时,服务器端同样通过控制字头后的昵称,查找到对应的接收端用户的信息,并将该用户的IP地址传递给发送端,并在服务器端显示发送端想要对接收端传输文件的信息。

④若控制字以“FILEFINISH:”开始,则表示文件传输完毕,此时服务器端发出文件传输完毕的信息。⑤若控制字以“FILELENFGTH:”开始,则表示传递的是文件的长度。

⑥若控制字以“VOICE:”开始,则说明是语音聊天的请求。后面的信息解析和文件传输请求是一样的原理。

⑦若控制字以“VOICEEND:”开始,则说明语音聊天结束,此时客户端的语音聊天两个相关的进程结束。

⑧当该用户注销时,服务器端更新在线用户列表以及IP地址—昵称的哈希映照表,并且刷新服务器端同客户端的用户列表显示,同时发出该用户离开的消息。

4.2客户端设计与编码

由于服务器端需要一次处理多个客户端的请求,所以客户端的设计均使用了Java的多线程处理机制实现。

4.2.1客户端程序

该段功能由Client.java文件中的Client类实现,具体实现过程如下:①新建客户端:初始化该客户端的监听器、套接字、在线用户列表以及发送消息的String流,并且将客户端连接状态设置为真。初始化一个客户端时,需要用到该客户端的IP地址、端口号、在线用户列表以及聊天内容列表等信息。

②建立监听:创建一个BufferedReader以及一个PrintStream之后,再通过多线程机制建立对服务器发来消息进行监听的监听器Listener。

③发送消息:客户端循环发送消息给服务器,直到发送的String

流遇到结尾字符。

4.2.2界面设计

局域网聊天系统该段功能由ClientFrame.java文件中的ClientFrame类实现(程序代码请见附录),具体实现过程如下:①窗口布局:服务器端窗口使用了BorderLayout事务管理器,把整个容器成了五个区域:North、South、East、West和Center,每个区域放置一个面板,每个面板又分别使用不同的事务管理器放置其他组件,如按钮、标签、文本框、进度条等,其中文件传输进度条初始化为不可见,各个组将构成了一个完整的客户端界面。

②事件处理:通过Java的授权事件模型,针对组件TextField、Button1~Button6,Button8-Button12,通过addXXXListener(主要运用了addActionListener)方法注册监听器,并且实现ActionListener接口中的actionPerformed方法,这样,当组件

触发了相应类型的事件后,此事件就会被传送给已注册的监听器,事件监听器负责处理事件。至此,实现了窗口对以下几个事件的响应:用户登录、退出、保存消息、清空消息、查看历史消息、文件发送、文件接收、文件开始传输、修改昵称、语音聊天、拒绝语音、结束语音以及消息发送。

4.2.3文件发送

该段功能主要实现文件发送,默认端口为9900,由FileSender.java 文件中的FileSender类实现

4.2.5消息监听

该类主要实现对服务器发送的消息进行监听的功能,由

Listener.java文件中的Listener类实现(程序代码请见附录),具体实现过程如下:

①使用缓冲输入流、在线用户列表以及聊天记录列表初始化Listener 对象的相关属性,并启动多线程。

②循环接收从服务器发送来的信息,直到输入流读到了String流的末尾,接着开始判断消息的类型。

③若控制字以“NICKNAME”开始,则证明需要更新用户列表,此时客户端进行相关操作。

相关文档