资源描述
局域网聊天系统设计报告
题 目 局域网聊天系统
班 级:
学 号:
姓 名:
完毕时间: 年 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,使用JavaSocket编程机制,分别建立客户端与服务器端使用是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.数据库
名
类型
长度
十进位
与否容许为空
与否为主键
备注
id
int
11
0
否
是
自动递增
account
vchar
20
0
否
否
password
vchar
20
0
否
否
question
vchar
20
0
是
否
answer
vchar
20
0
是
否
e_mail
vchar
20
0
是
否
reg_time
timestamp
0
0
否
否
刷新为当前时间
last_login_
time
timestamp
0
0
否
否
默以为0000-00-00 00:00:00
第三章 系统实现
3.1 管理子系统
图4 登录界面
图5 注册界面
图6 在线界面
图7 私聊界面
图8 群聊界面
第四章 设计总结
一方面,本次课程设计认真学习了论坛中关于程序,以及参照文献中书籍中提出观点。然后进行了系统构造设计,最后进行代码实现。
本次课程设计运用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<WindowEvent>() {
@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<WindowEvent>() {
@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");
}
}
});
展开阅读全文