简易聊天应用程序的设计与实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Java网络程序设计大作业分组报名表
目录
一、团队介绍及人员分工 0
1.1 团队介绍 0
1.2 人员分工 0
二、作品概述 0
2.1 创作背景 0
2.2 功能概要 0
2.3相关技术 0
2.4 作品可行性分析 (1)
三、需求分析 (1)
3.1 功能性需求 (1)
3.2 非功能性需求 (2)
四、作品实现 (2)
4.1服务端界面实现 (2)
4.2客户端界面实现 (3)
4.3登录实现 (4)
4.4 闲聊功能实现 (5)
4.5 退出功能实现 (5)
五、作品设计、实现难点分析 (6)
5.1 难点分析 (6)
5.2 解决方案 (6)
5.3 测试结果 (7)
一、团队介绍及人员分工
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可以移植到不同平台的机器。

网络包支持Internet的TCP/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中运行测试,能实现预期的功能,项目完工!。

相关文档
最新文档