局域网聊天系统设计报告
题目局域网聊天系统
班级:
学号:
姓名:
完成时间:2015 年10 月
目录
第一章引言 ............................................................................................................................. - 2 -
1.1开发背景 ...................................................................................................................... - 2 -
1.2需求分析 ...................................................................................................................... - 2 - 第二章系统设计 .. (3)
2.1 功能设计 (3)
2.2 系统架构 ..................................................................................................................... - 5 -
2.3 模块设计 (3)
2.4 流程(或算法)设计 (5)
2.5 类与接口设计 (5)
第三章系统实现 (7)
3.1 管理子系统 (7)
第四章设计总结 (10)
参考文献 (10)
附录(核心代码) (11)
局域网聊天系统
第一章引言
本文围绕Java编程语言在网络编程方面的具体应用,论述了使用面向对象方法,对局域网聊天程序进行需求分析、概要设计、详细设计,最后使用Java 编程实现的全过程。在编程我们使用的java语言,是目前比较流行的编程语言。在当今这个网络的时代,java语言在网络编程方面的优势使得网络编程有了更好的选择。Java语言最大的特点是具有跨平台性,使其不受平台不同的影响,得到了广泛的应用。
1.1开发背景
随着互联网的发展,人们对网络的依赖越来越大,越来越离不开网络,网络聊天工具作为一种交流工具,已经受到网民的青睐。目前,出现了很多功能强大的聊天工具,其中应用比较广泛的有腾讯QQ、MSN-Messager等等。即时通讯软件,是每一个上网用户都需要的工具,它除了能够让您迅速地在网上找到自己的朋友和伙伴之外,还可以实时交谈和传递信息,截止到目前,全球约有近3亿多人使用即时软件,正因为即时通讯软件拥有数以亿计的用户和增长的市场,所以各个公司都盯上了这个最大的市场,一时间,即时通讯市场硝烟四起。而且通过制作该程序还能更好的学习网络软件编程知识。
1.2需求分析
i.寻找服务器登陆
ii.能够实现点对点单聊
iii.能够实现文件传输
iv.能动态更新在线用户列表
该系统实现了用户之间的点对点单人聊天。为了加强之间的信息交流,还实现了用户之间文件传输,文件共享。在客户端和服务器端都可以查看历史消息、保存消息、清空消息。为了监控用户之间的状态,服务器实时刷新在线用户列表,同时用户时间文件传输的信息都会在服务器上显示。
第二章系统设计
2.1 功能设计
整个系统分为服务器和客户端,服务器端维护各个客户端的信息。客户端的所有信息发往服务器端,再由服务器进行消息的分析处理并做出相应的控制,服务器端是所有信息的中心。
服务器端可以查看所有用户的聊天记录,监控所有用户的状态,发出用户上线、离线提示等公告,客户端则提供接收公告的功能。
本课程设计按照系统的具体功能要求,首先应用Socket编程创建客户端和服务器端,每多个客户端服务器端就会相因的创建一个线程,它们之间通过这个连接来实现数据通信;然后在客户端设置一个监听器,用于监听服务器发来的消息。并根据消息做出不同的动作。
2.2系统架构
(1)选择传输控制协议TCP,使用Java的Socket编程机制,分别建立客户端与服务器端使用的是UDP控制协议;
(2)分别设计客户端与服务器端的界面,并使用Java应用程序用户界面的开发工具包Swing进行窗体界面的布局,以及实现部分窗口事件的相应。
2.3 模块设计
(1)服务器端
主要实现向各个客户端发布系统消息,接受来自客户端的各种信息并分别处理。具体功能如下:
①连接控制:包括启动服务器、断开服务器以及断开某个客户端的连接;
②管理作用:包括对参与聊天者的昵称进行修改以及向所有或某个客户
端发送消息,维护一个IP地址和昵称所对应的哈希表,以
便定位到正确的客户端,且有权强制修改用户昵称;
③刷新列表:在有用户登陆或离开的时候实时更新列表,并将信息反馈到
各个客户端;
④登陆信息:检查用户是否已登陆,如登录,发消息通知所有用户。同时
刷新在线用户列表;
⑤聊天记录:能保存聊天记录,实现消息的保存、清空以及查看等功能;
⑥消息处理:解析客户端与服务器端的消息交互类型,并做出相应处理,
能够找到消息所对应的接收端。
服务器端结构如图1:
图1 服务器端结构
(2)客户端
主要实现向服务器端发布消息,并且对来自服务器的消息做出相应的响应。具体功能如下:
①连接功能:输入服务器地址,实现登录及断开功能
②登录设置:登录时,发送消息使服务器端获得相关登录信息,昵称及IP
地址记录到服务器端维持的哈希表,断开后发送消息使IP
地址及昵称从哈希表中删除;
③监听作用:实现对服务器发送过来的消息进行监听的功能;
④消息处理:接收由服务器端发送来的信息,并做出相应的响应;
相应从服务器端接收到的消息交互类型,实现用户与用户之
间的信息交互和文件交互;
客户端结构如图2:
图2 客户端结构2.4 流程(或算法)设计
图3 系统功能流程
2.5 类与接口设计
1.用户注册功能分析
用户向服务器发出注册请求,首先建立和服务器的连接,其次注册提交窗体(Register)要进行用户输入判断,若用户提交的账号和密码有一项为空或者全为空,则无法发送提交的账号和密码,然后服务器在数据库中查找用户提交的账号是否已经存在,若存在则向用户发送“1”(账号已存在)的消息,否则发送“0”(注册成功)的消息。
2.用户登录功能分析
登录用户向服务器发出登录请求,首先建立和服务器的连接,其次登录窗体(Login)要进行用户输入判断,若登录用户输入的账号和密码有一项为空或者全为空,则无法发送登录的账号和密码,然后服务器在用户在线列表中查找登录用户提交的账号是否已经在线上,若已经在线则向登录用户发送“havelogin”(账号account登录失败,用户已经在线)的消息,窗体不跳转,否则服务器在数据库中查找登录用户提交的账号是否已经存在,若不存在则向用户发送“1”(登录失败,用户不存在,请先注册)的消息,窗体不跳转,反之服务器在数据库中查找登录用户提交的账号和密码是否正确匹配,正确则向登录用户发送“0”(登录成功)消息,并将登录用户加入在线用户列表,窗体跳转到AfterLogin窗体,不正确则向登录用户发送“2”(登录失败,密码不正确)消息,窗体不跳转。
3.用户群体聊天功能分析
在线用户向服务器发出群聊请求(基于跟服务器建立的连接通道)首先群聊窗体(publicChat)要进行当前用户的输入判断,若当前用户输入的消息为空,则无法发送(提醒:请输入非空的语言),然后服务器收到用户发来的群聊消息,并向的所有在线用户转发该用户发来的群聊消息。
4.用户私人聊天功能分析
在线用户向服务器发出私人聊天请求(基于跟服务器建立的连接通道),首先私聊窗体(Session)要进行当前用户的输入判断,若当前用户输入的消息为空,则无法发送(提醒:请输入非空的语言),然后服务器收到用户发来的私聊消息,服务器对私聊消息进行解析,并将消息转发给当前用户要进行私聊的在线用户。
5.用户在线列表刷新功能分析
登录用户登录成功以后,会进行窗体跳转,跳转到AfterLogin窗体,在窗体加载的时(基于和服务器的通道),当前用户将上线消息发送给服务器并获取到服务器发来的在线用户列表(保存下来),同时当前用户端要启动一个子线程
来接收服务器发来的消息。当用户端子线程读取到服务器发来以“online”开头的消息时(当有用户上线或下线时就会发送一次),子线程能将更新任务打包发送给用户端主线程,进行AfterLogin窗体“联系人”-“在线用户”的修改。
6.用户下线通知功能分析
当前在线用户进行下线操作以后,服务器会收到用户下线的通知,此时服务器就会将下线的用户从在线用户列表中删除,并向剩下的所有在线用户发送该用户下线消息(剩下的在线用户能接到提示),同时服务器再一次向所有的在线用户发送一次以“online”开头的在线用户列表,则用户端子线程就能将更新任务打包发送给用户端主线程,进行AfterLogin窗体“联系人”-“在线用户”的修改。
7.数据库
第三章系统实现3.1 管理子系统
图4 登录界面
图5 注册界面
图6 在线界面
图7 私聊界面
图8 群聊界面
第四章设计总结
首先,本次课程设计认真学习了https://www.wendangku.net/doc/8b5358885.html,/论坛中有关程序,
以及参考文献中的书籍中提出的观点。然后进行了系统结构设计,最后进行代码实现。
本次课程设计利用Java应用程序Socket编程实现以下功能:使用Java的多线程处理机制建立两个套接字分别作为服务器和客户端。
服务器端实现对客户端聊天内容的监听并且接受来自客户端的各种信息请求,可以控制客户端的链接以及对用户的管理作用,并且实时的检测在线用户,对在线用户列表刷新。而且可以为服务器端自动保存消息记录并完成服务器端与客户端的交互。
客户端则连接到特定的服务器,实现聊天服务,文件传输,文件共享等功能,并且能够监听服务器发来的消息并进行回应。
由此可见本次课程设计完成了最初的设计要求,实现简单的局域网聊天功能。
程序编写中用到了JAVA中的Swing组件,面板容器,事件处理,线程的创建、同步,输入输出处理,内部类,异常处理,和网络通信的知识,更深一步的加固了本学期所学知识,收获很多。
在这次的课程设计中,我也用到了Socket 类和ServerSocket类,明白了它们是Java实现Socket通信的主要工具。创建 ServerSocket对象就创建了一个监听服务,创建一个Socket对象就建立了一个Client与Srever间的连接。明白了Java语言网络编程的可靠性,平台无关性。
总之通过本次课程设计,掌握了使用Java语言进行面向对象设计的基本方法,提高了运用面向对象知识解决实际问题的能力。
本次课程设计的不足:本次课程设计中没有实现语音聊天功能和群聊功能。在以后的学习中定会注意这方面的学习,以得到补充。
附录(核心代码)
(1)服务器端:
1.数据库连接
public class DBOperator {
private static Connection conn;
private DBOperator() {}
public static synchronized Connection getConnectionInstance() { if (conn == null) {
conn = getConnection();
}
return conn;
}
…
2.客户端与服务器通信
NetTalk
private static NetTalk talk = null;
private Socket client = null;
private DataOutputStream dos = null;
private DataInputStream dis = null;
private NetTalk() {…}
public static NetTalk getTalkInstance() {…}
public String readMsg(){…}
public void writeMsg(String msg){…}
(2)客户端
1.用户登录功能实现
public class LoginController {
public TextField account;
public PasswordField password;
public Button LoginButton;
public Hyperlink register;
public void onClick(){
String account=this.account.getText();
String password=this.password.getText();
// int errorCode=UserService.register(account, password);
int errorCode=UserService.login(account,password);
if(errorCode==0){
//登录成功,跳转到主界面
UserService.currentAccount=account;
Main.goMainUI();
}else if(errorCode==1){
//提示:网络连接超时
}else if(errorCode==2){
//提示:密码或账号不对
}
}
2.群体聊天功能实现
else if (result.startsWith("public")) {
final String[] msg = result.split(":");
// Stage stage=UserService.chatUI.get("public");
// if(stage==null){
// stage=Main.goPublicUI();
// UserService.chatUI.put("public",stage);
// }
Platform.runLater(new Runnable() {
public void run() {
// 把消息放到public聊天窗口
BaseController stage = UserService.chatUI.get("public");
if (stage == null) {
stage = Main.goPublicUI();
UserService.chatUI.put("public", stage);
stage.stage.setOnCloseRequest(new EventHandler
@Override
public void handle(WindowEvent event) {
// TODO Auto-generated method stub
UserService.chatUI.remove("public");
}
});
//UserService.chatUI.put("public",stage);
}
2.私聊功能实现
else if (result.startsWith("private")) {
final String[] msg = result.split(":");
Platform.runLater(new Runnable() {
public void run() {
// 把消息放到chat聊天窗口
BaseController stage = UserService.chatUI.get(msg[1]);
if (stage == null) {
toname = msg[1];
stage = Main.goChatUI();
UserService.chatUI.put(msg[1], stage);
stage.stage.setOnCloseRequest(new EventHandler
@Override
public void handle(WindowEvent event) {
// TODO Auto-generated method stub
UserService.chatUI.remove(msg[1]);
}
});
}
ChatController c=(ChatController)stage;
if (c != null&& c.accMessageBox != null) {
c.accMessageBox.appendText(msg[3] + "\n");
}
}
});