资源描述
Java网络程序设计大作业分组报名表
项目名称
简易聊天应用程序设计与实现
项目功能
网络聊天室普通直称聊天室,是一种人们可以在线交谈网络论坛,在同一聊天室人们通过广播消息进行实时交谈。运用java程序编写聊天室,实现简朴聊天功能。它是图形界面,线程,流与文献系统等技术综合应用。程序实现了聊天室基本功能,其中有:
1.启动服务器。
2.启动登陆界面。
3.进入客户端界面。
4.发送信息。
5.离开客户端界面。
6.关闭服务器。
团队成员
姓名
性别
年级
院、系、专业
学号
备注
计算机科学与技术
计算机科学与技术
计算机科学与技术
计算机科学与技术
指引教师
姓名
研究
方向
软件设计
职称
团队
联系
方式
联系人
姓名
联系电话
邮件
地址
邮编
目 录
一、团队简介及人员分工 1
1.1 团队简介 1
1.2 人员分工 1
二、作品概述 1
2.1 创作背景 1
2.2 功能概要 1
2.3有关技术 2
2.4 作品可行性分析 3
三、需求分析 3
3.1 功能性需求 3
3.2 非功能性需求 6
四、作品实现 6
4.1服务端界面实现 6
4.2客户端界面实现 8
4.3登录实现 9
4.4 聊天功能实现 11
4.5 退出功能实现 12
五、作品设计、实现难点分析 14
5.1 难点分析 14
5.2 解决方案 14
5.3 测试成果 15
一、团队简介及人员分工
1.1 团队简介
吴益帆:有良好统筹能力和领导力,能合理安排各成员工作。
张咪:踏实耐心,有良好创新能力和策划能力。
沈丹丹:勤奋刻苦、有钻研精神,对待编程工作热情细心,孜孜不倦。
吴晓晓:对待工作细致专注,设计能力较强。
团队成员之间有较好默契度及协作性。分工明确,各司其职,在共同努力及互相配合下,共同解决程序中浮现困难并尽量优化程序,最后完毕整个项目。
1.2 人员分工
吴益帆:负责程序最后整顿,完毕某些功能及错误解决。
张咪:负责程序编码某些及项目详细功能实现。
沈丹丹:负责程序界面某些,为改程序搜索解决方案。
吴晓晓:负责程序策划某些,项目可行性分析及文档编写工作。
二、作品概述
2.1 创作背景
网络聊天室普通直称聊天室,是一种人们可以在线交谈网络论坛,在同一聊天室人们通过广播消息进行实时交谈。
在当今信息时代,越来越多聊天工具被应用,java语言是当今流行网络编程语言,它具备面向对象,与平台无关,安全,多线程等特点。使用java语言不但可以实现大型公司级分布式应用系统,还可觉得小型,嵌入式设备进行应用程序开发。面向对象开发是当今世界最流行开发办法,它不但具备更贴近自然地语义,并且有助于软件维护和继承,锻炼咱们纯熟地应用面向对象思想和设计办法解决实际问题能力。
2.2 功能概要
运用java程序编写聊天室,实现简朴聊天功能。它是图形界面,线程,流与文献系统等技术综合应用。其界面重要采用了java.awt包,java.swing包等。程序实现了聊天室基本功能,其中有:
(1) 服务器端功能描述:
启动服务器端:点击“启动”按钮,启动服务;
端口服务:输入服务器某个端标语,启动服务器这个端口;
显示在线顾客信息:在右边顾客列表显示所有在线顾客信息;
显示顾客聊天信息:在左边聊天信息区域内显示所有顾客所发信息;
服务端关闭:点击“关闭’按钮,关闭服务。
(2) 客户端功能描述:
启动客户端:运营客户端程序,启动客户端;
选取服务器端标语:输入想要连接服务器端标语;
顾客登录:填入顾客名,点击“登录”按钮,连接相应服务器;
显示在线顾客:在右边顾客列表中可以看到当前在线顾客;
发送/接受聊天消息:在下面文本输入区域输入要发送内容,点击发送可以在左边聊天信息区域内显示自己以及其她顾客所发信息;
顾客离线:点击“离线”按钮,与服务器断开连接;
客户端关闭:关闭客户端图形顾客界面,关闭客户端。
2.3有关技术
(1) Java概述
JAVA语言有下面某些特点:简朴、面向对象、分布式、解释执行、鲁棒、安全、体系构造中立、可移植、高性能、多线程以及动态性。
丰富类库JAVA提供了大量类以满足网络化、多线程、面向对象系统需要。语言包提供支持涉及字符串解决、多线程解决、数学函数解决等,可以用它简朴地实现JAVA程序运营平台。实用程序包提供支持涉及哈希表、堆栈、可变数组、时间和日期等。输入输出包用统一"流"模型来实现所有格式I/O,涉及文献系统、网络、输入低档网络包用于实现Socket编程。抽象图形顾客接口包实现了不同平台计算机图形顾客接口部件,涉及窗口、菜单、滚动条、对话框等,使得JAVA可以移植到不同平台机器。网络包支持InternetTCP/IP合同,提供了与Internet接口。它支持URL连接,WWW即时访问,并且简化了顾客/服务器模型程序设计。
(2) 套接字
Socket,简称套接字,用于实现网络上客户和服务器之间连接。也就是说网络上两个或两个以上双工方式通信进程之间总有一种连接,这个连接端点成为套接字,套接字是在比较低层次上通信。
详细说:一种服务器应用程序普通侦听一种特定端口等待客户端连接祈求,当一种连接祈求到达时,客户端和服武器端建立一种通信连接,在连接过程中,客户端被分派一种本地端口与一种Socket建立连接,客户端通过写Socket来告知服务器,以读Socket中信息,类似服务器也获得一种本地端口,它需要一种新端标语来侦听原始端口上其她连接祈求。服务器也通过它本地端口连接一种Socket,通过读写和客户端通信。
Socket程序工作过程:
1.建立Socket连接:在通信开始之前由通信双方确认身份,建立一条专用虚拟连接道。
2.数据通信:运用虚拟连接通道传送数据信息进行通信。
3.关闭:通信结束时,再将所建虚拟连接拆除。
2.4 作品可行性分析
由于本软件知识一种聊天程序,程序只提供顾客之间聊天功能,故对网络传播数据规定不是很高,只要正常传播速度就可以了。
三、需求分析
3.1 功能性需求
本聊天室分为聊天室服务端和聊天室客户端,服务端与客户端之间通过套接字Socket(TCP)连接。在java中使用套接字相称简朴,Java API为解决套接口通信提供了一种类.Socket.,使得编写网络应用程序相对容易.服务器采用多线程以满足多顾客祈求,并通过创立一种ServerSocket对象来监听来自客户连接祈求,默认IP地址为:localhost默认端口为8888。
(1) 聊天室服务端模块,涉及端口服务、启动服务、关闭服务、显示在线顾客、显示顾客聊天信息,如图3.1所示;
图3.1聊天室服务端模块图
端口服务:输入要侦听端口,默以为8888;
启动服务:启动服务器,并开始在设立端口中侦听,客户端顾客可以登录并开始聊天;
关闭服务:关闭服务器,侦听结束。客户端顾客不能再聊天;
显示在线顾客:服务器列表显示在线顾客数和所有在线顾客名称;
显示顾客聊天信息:在文本区中显示所有顾客聊天信息和登录、退出信息。
(2) 聊天室客户端模块,涉及顾客登录、顾客离线、连接设立、发送和接受聊天信息、显示在线顾客、退出,如图3.2所示:
图3.2聊天室客户端模块图
顾客登录:只能在聊天室服务端已启动状况下,顾客点击“按钮”才干登录,顾客登录之后才干开始聊天,登录后不能再修改顾客设立和连接设立;
顾客离线:顾客点击“离线”按钮,退出聊天,与服务器断开连接;
连接设立:顾客可以设立自己连接服务器IP地址和端标语,默认连接地址为:localhost:8888;
发送和接受聊天信息:顾客可以给所有人发送信息,并能看到其她顾客发送给所有人消息;
显示在线顾客:服务器列表显示在线顾客数和所有在线顾客名称;
退出:关闭所有聊天并退出客户端。
(3) 程序流程:一方面启动服务器,顾客打开客户端,输入服务器端标语,再输入顾客名就可以登录,登录后来会显示当前在线顾客信息,顾客可以看到其她顾客所发信息,自己也可以发送信息。顾客点击离线就会与服务器断开连接,最后关闭服务器,如图3.3所示:
图3.3程序流程图
3.2 非功能性需求
(1) 安全需求
本程序能防卫禁止未登录顾客进行通信,防止数据丢失,需要输入顾客名、端标语连接相应服务器才容许顾客间通信。
(2) 性能需求
本程序使用对象是所有运营该程序顾客,顾客在连接服务器可以进行客户端之间通信。
(3) 易用性需求
本程序使用对象计算机水平普通,有一定易用性上规定,程序应当存在着某些和谐性提示,提高程序和谐度。
(4) 可维护性需求
本程序可以及时发现并纠正系统故障,对系统数据进行备份,有系统还原功能。
(5) 健壮性需求
本程序在遭遇非法输入数据,可以排除该数据并继续运营;对于系统异常有完备预警防止解决机制。
四、作品实现
4.1服务端界面实现
在服务端启动后,要显示“简易聊天室服务器”图形顾客界面,如图6.1所示:
图6.1 服务端图形顾客界面
“简易聊天室服务器”图形顾客界面实现重要代码如下:
private Label svrIP = new Label("服务器IP:");
private TextField showSvrIP = new TextField();
private Label svrPort = new Label("服务器端口:");
private TextField getSvrPort = new TextField("8888");
private Button enter = new Button("启动");
private TextArea output = new TextArea();
private Label user = new Label("当前在线顾客(0)");
private List list = new List();
private void setup() {
Panel top = new Panel();
top.setLayout(new FlowLayout());
top.add(svrIP);
svrIP.setBackground(bg);
top.add(showSvrIP);
showSvrIP.setBackground(bg);
top.add(svrPort);
svrPort.setBackground(bg);
top.add(getSvrPort);
getSvrPort.setBackground(bg);
top.add(enter);
enter.setBackground(bg);
Panel east = new Panel();
east.setLayout(new BorderLayout());
east.add("North",user);
user.setBackground(bg);
east.add("Center",list);
list.setBackground(bg);
setLayout(new BorderLayout());
add("North",top);
top.setBackground(bg);
add("East",east);
east.setBackground(bg);
add("Center",output);
output.setBackground(bg);
setBackground(bg);
}
点击“启动”按钮,启动默认服务器8888端口,如图6.2所示:
图6.2 服务端端口启动
8888端口启动实当代码如下:
try {
server = new ServerSocket(Integer.parseInt(getSvrPort
.getText()));
rightNow = Calendar.getInstance().getTime()
.toLocaleString();
output.append(rightNow + "\n启动服务器.\n\n");
enter.setLabel("关闭");
ht = new Hashtable();
ht_s = new Hashtable();
st = new ServerThread();
serving = true;
} catch (IOException ioe) {
output.append("Error:" + ioe + "\n\n");
}
4.2客户端界面实现
在客户端启动后,显示“简易聊天室客户端”图形顾客界面,如图6.3所示:
图6.3 客户端图形顾客界面
“简易聊天室客户端”图形顾客界面实现重要代码如下:
private Button B_login = new Button("登陆");
private Button B_logout = new Button("离线");
private Button B_send = new Button("发送");
private Label userName = new Label("您顾客名:");
private TextField getUserName = new TextField();// 获取顾客名
private Label svrIP = new Label("当前服务器IP:");
private TextField getSvrIP = new TextField();// 获取服务器 IP 地址
private Label svrPort = new Label("当前服务器端口:");
private TextField getSvrPort = new TextField();// 获取服务器端口
private TextArea input = new TextArea();// 输入文本框
private TextArea output = new TextArea();// 输出文本框
private Label user = new Label("当前在线顾客(0)");
private List list = new List();
private void setup() {
Panel top1 = new Panel();
top1.setLayout(new BorderLayout());
top1.add("West",userName);
userName.setBackground(bg);
top1.add("Center",getUserName);
getUserName.setBackground(bg);
Panel top2 = new Panel();
top2.setLayout(new BorderLayout());
top2.add("West",svrIP);
svrIP.setBackground(bg);
top2.add("Center",getSvrIP);
getSvrIP.setBackground(bg);
Panel top3 = new Panel();
top3.setLayout(new BorderLayout());
top3.add("West",svrPort);
svrPort.setBackground(bg);
top3.add("Center",getSvrPort);
getSvrPort.setBackground(bg);
Panel top4 = new Panel();
top4.setLayout(new BorderLayout());
top4.add("North",top1);
top4.add("Center",top2);
top4.add("East",top3);
Panel east = new Panel();
east.setLayout(new BorderLayout());
east.add("North",user);
user.setBackground(bg);
east.add("Center",list);
list.setBackground(bg);
Panel center = new Panel();
center.setLayout(new BorderLayout());
center.add("Center",output);
output.setBackground(bg);
center.add("South",input);
input.setBackground(bg);
center.add("East",east);
east.setBackground(bg);
Panel south = new Panel();
south.setLayout(new FlowLayout());
south.add(B_login);
B_login.setBackground(bg);
south.add(B_send);
B_send.setBackground(bg);
south.add(B_logout);
B_logout.setBackground(bg);
setLayout(new BorderLayout());
add("North",top4);
add("Center",center);
add("South",south);
setBackground(bg);
}
4.3登录实现
在客户端输入顾客名,点击“登陆”,客户端显示系统时间和“您已成功登陆”( 如图6.4所示),并将顾客名发送给服务端。服务端接受来自客户端数据,显示“sdd登陆”以及将顾客名显示在顾客列表中(如图6.5所示),并将顾客数据发送给所有在线客户端。
图6.4 顾客登录
顾客登录代码实现如下:
if (login) return;
boolean accepted = false,refused = false;
String line = new String("");
try {
connection = new Socket(getSvrIP.getText(),
Integer.parseInt(getSvrPort.getText()));
in = new DataInputStream(connection.getInputStream());
out = new DataOutputStream(connection.getOutputStream());
out.writeUTF("L " + getUserName.getText());
while (!accepted && !refused) {
line = in.readUTF();
if (line.charAt(0) == 'R') { refused = true;}
if (line.charAt(0) == 'A') { accepted = true;}
}
if (refused) {
rightNow = Calendar.getInstance().getTime().toLocaleString();
output.append(rightNow + "\n登录失败请使用合法顾客名.\n\n");
}
if (accepted) {
rightNow = Calendar.getInstance().getTime().toLocaleString();
output.append(rightNow + "\n您已成功登陆.\n\n");
login = true;
}
}
图6.5 服务端显示顾客
服务端向在线顾客发送当前在线顾客列表代码实现如下:
login = true;
list.add(userName);
user.setText("User (" + list.getItemCount() + ")");
String[] str = list.getItems();
line = "A ";// accepted
for (int i = 0;i < str.length;i++) { line += (str[i] + " ");}
out.writeUTF(line);
line = "L " + userName;
rightNow = Calendar.getInstance().getTime().toLocaleString();
output.append(rightNow + "\n" + userName + " 登陆.\n\n");
客户端获取当前在线顾客列表代码实现如下:
String[] str = line.split(" ");
for (int i = 1;i < str.length;i++) {
list.add(str[i]);
}
user.setText("当前在线顾客(" + list.getItemCount() + ")");
4.4 聊天功能实现
启动各种客户端,并登录。在输入框中输入信息,点击“发送”,数据传送至服务端(如图6.6所示),再由服务端数据发送给其她客户端。每个客户端都接受服务端发送过来数据,并显示在消息框中,如图6.7所示。
图6.6 服务端显示消息
顾客发送消息代码实现如下:
private void sendMsg() {
if (!login)
return;
try {
if (input.getText().equals("")) {
output.append("\n发送内容不能为空请重新输入\n\n");
return;
}
out.writeUTF("M " + input.getText());
input.setText("");
} catch (IOException ioe) {
output.append("Error:" + ioe + "\n\n");
}
}
图6.7 客户端端显示消息
4.5 退出功能实现
当顾客点击“离线”,该顾客客户端显示“您已成功离线”,其她顾客客户端显示“wxx离线” (如图6.8所示);服务端显示“wxx离线”(如图6.9所示)。
图6.8 客户端离线
图6.9 服务端显示顾客离线
离线实当代码如下:
private void Quit() {
if (!login)
return;
try {
out.writeUTF("Q");
user.setText("当前在线顾客 (0)");
} catch (IOException ioe) {
output.append("Error:" + ioe + "\n\n");
}
}
如果顾客直接关闭客户端窗口,服务端则显示“客户端zm意外关闭”,如图6.10所示:
图6.10 服务端显示顾客意外关闭
客户端意外关闭实当代码如下:
catch (SocketException se) {
ht.remove(userName);
ht_s.remove(connection);
list.remove(userName);
output.append("客户端" + userName + "意外关闭\n");
}
五、作品设计、实现难点分析
5.1 难点分析
一种项目开发过程并不总是一帆风顺,其中难免会遇到困难,使编程无法继续下去。本程序难点在于对通信机制理解以及实现,同步窗口之间通讯也需要认真分析。
5.2 解决方案
针对程序设计过程中遇到困难,咱们采用了积极有效解决办法:团队讨论、上网搜索及向有经验人员请教。查看了大量有关资料,最后通过重复调试及测试,解决了上述难点,实现了服务器与客户端通信。
5.3 测试成果
程序在Eclipse中运营测试,能实现预期功能,项目竣工!
展开阅读全文