目 录
1 绪论 1
1.1 项目概述 1
1.2 项目意义 1
2 开发工具和相关技术简介 2
2.1 Eclipse简介(或者MyEclipse或者IEDA简介) 2
2.2 Java语言介绍 2
3 系统需求分析 4
3.1 系统可行性分析 4
3.2 系统需求分析 4
3.3 组内成员分工 4
3.4 项目进度安排 5
4 系统设计 6
4.1 系统设计 6
5 系统实现 8
5.1 管理员登录界面实现 8
5.2 管理用户信息界面实现 8
6 系统测试 10
7 结论和心得 11
1.1 项目概述
本项目主要是利用JAVA语言制作一个聊天室,采用的是客户/服务器。 二层的C/S结构是指以单一的服务器和局域网为核心,能通过客户端与用户进行直接对话。主要有二大功能:一是它用于检查用户从键盘等输入的数据,显示应用输出的数据。为使用户能直观地进行操作,一般要使用图形用户接口(GUI),操作简单、易学易用。在变更用户接口时,只需改写显示控制和数据检查程序,而不影响其他。检查的内容也只限于数据的形式和值的范围,不包括有关业务本身的处理逻辑。
1.2 项目意义
网络聊天作为一种新的聊天方式,其特质包括五个方面,即身体缺席、场景隔离、角色可塑、“符号性”以及“陌生意识人格释放”:网络聊天的意义可以从两个层面理解。一是在交往层面上,它作为对现实交往有限性的一种突 破,具有补偿、延伸以及拓展的意义,二是在文化层面上,它所生成的虚拟世界,本质上是一种心理的构建,具有心理功能。网络聊天,即通过网络进行聊天。是伴随网络技术的飞速发展而逐渐兴起的一种新的网络人际交往和沟通方式。就其一般性来看,这种聊天方式依然具有现实聊天的话语交流特征;但同时因为其交流介质的特殊性,又具有不同于现实聊天的特殊内容。一、网络聊天的特质网络聊天之所以不同于现实聊天,根源性差异在于二者的背景机制不同。现实聊天所以可能,是因为它具备五个基木要素:一是参与性上,主体的身体是完全在场的:二是场景设置上,聊者双方是居于同一时空中的:三是聊者关系上,主体之间身份是明确的:四是互动上,交流具有行为性特征,如肢体接触、表情表达等;五是形象上。彼此的形象设计和表达,是基于一种“自我表达"和“规范遵守"这样的心理基础。与此相对,网络聊天因其生成机制的特殊性,表现出其自身的特质:网络聊天主体的身体是不完全在场的。在虚拟背景下。元论是键盘敲打聊天还是音频或视频聊天,共同特征都是聊天主体的身体不完全参与。这种不完全参万主要表现在:网络聊天基本上不见对方“庐山真面目”,即使是通过视频获得身体影像。也是间接的,也是一种“似真”, 与现实的“眼见为实"无法相提并论。更不用说通过肢体性接触来辅助话语的表达了。这是因为,影像的本质是-种数字编码,是对现实景象的“克隆“或者“拍摄”。它是现实原像的一种复制而不是其本身。所以,影像对于真实的原像来说。是一种“似真”,即“真"的是数字编码对象的真实性。
2 开发工具和相关技术简介
本项目是聊天室小程序。开发环境:myeclipse;开发语言:java;开发技术:Gui等。本章将对开发工具和相关技术进行简单介绍。
Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。
Java语言是一款面向对象的一款高级语言是由Sun Microsystems公司(现已被oracle公司收购)。由James Gosling和同事们共同研发,并在1995年正式推出,据oracle官方数据指数,目前全球已有上亿的系统是使用Java开发的。Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。
技术可行,操作可行
需求分析,聊天程序应实现以下几项功能:登录、注册、公聊、私聊、传文件、注销等。
登录: 需要用用户密码 ,判断对错,对的就进去,错的就检查,然后重新输入,没有用户密码的就需要注册
注册 :输入用户名和密码,注册成功后再登录
公聊 :聊天室用户输入的用户名和密码都正确后,则进入聊天室。聊天主界面主要由四大版块组成:公聊的聊天信息、在线用户列表、好友列表,系统消息和聊天的一些操作。
私聊:如果两个人聊的话题比较隐秘,不想被其他人看到,就要使用私聊。在这里,如果说话对象是所有人的话,不能选择私聊;从当前好友列表中选择了一个用户之后,则私聊对话框弹出
传文件:可以进行互传文件
注销:就是不再使用聊天室,退出,下线
表3-1 组内成员分工情况表
序号 |
姓名 |
组内角色 |
小组分工 |
备注 |
01 |
赵洲 |
组长 |
登陆 注册 |
|
02 |
邱鑫良 |
组员 |
服务 客户端(公 私聊) |
|
03 |
陈朗 |
组员 |
服务 客户端(公 私聊) |
|
04 |
王泽鑫 |
组员 |
聊天室 |
|
说明:组内角色:组长为项目经理;其他人分别为编码、测试、架构师等。
进度安排如表3-2所示。
表3-2 进度安排表
阶段 |
持续时间 |
阶段描述 |
输出 |
构思阶段 |
2h |
需求分析 |
需求说明,功能模块图 |
设计阶段 |
3h |
系统设计 |
设计说明-可以画流程图;数据库设计 |
是现阶段 |
6h |
编写代码 |
项目工程源代码 |
1h |
系统测试 |
进行黑盒测试(功能测试)-测试说明 |
|
运行阶段 |
2h |
部署、运行 |
系统使用说明、运维报告-答辩 |
根据系统的实际功能需求分析,对系统功能部分进行了设计。
n 用户注册
第一次用户需要提供个人注册信息,注册用户名,密码,个人信息必须提供完整,并且存储在文件中。
n 用户登录
用户输入用户名和密码,提交给将服务器端的确认,根据从服务器中传过来的确认信息,判断用户登录的情况。
如果用户名和密码正确的话,则登录聊天室主界面;如果已经在线,则输出已经在线;否则输出用户名和密码错误,需要重新登录或者注册。
n 用户公聊
用户输入的用户名和密码都正确后,则进入聊天室。聊天主界面:公聊的聊天信息、在线用户列表、好友列表,系统消息和聊天的一些操作。
n 用户私聊
如果两个人聊的话题比较隐秘,不想被其他人看到,就要使用私聊。在这里,如果说话对象是所有人的话,不能选择私聊;从当前好友列表中选择了一个用户之后,则私聊对话框应该弹出来。
n 文件传递
两个用户在聊天过程中,可能需要相互间传送文件。象用户聊天信息和在线用户这样一些信息都是保存在服务器端,然后每个客户读取服务器端向量中的内容,此时服务器与客户端的联系是一对多的,而传送文件是一对一的。所以直接传送,不需要经过服务器端保存。
n 用户上 下线
用户登陆 退出。
1.登陆界面
1.登陆
需要用用户密码 ,判断对错,对的就进去,错的就检查,然后重新输入,没有用户密码的就需要注册
监听
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Properties userPro = new Properties();
File file = new File("Users.properties");
CatUtil.loadPro(userPro, file);
String u_name = textField.getText();
if (file.length() != 0) {
if (userPro.containsKey(u_name)) {
String u_pwd = new String(passwordField.getPassword());
if (u_pwd.equals(userPro.getProperty(u_name))) {
try {
Socket client = new Socket("localhost", 8520);
btnNewButton.setEnabled(false);
CatChatroom frame = new CatChatroom(u_name,
client);
frame.setVisible(true);// 显示聊天界面
setVisible(false);// 隐藏掉登陆界面
} catch (UnknownHostException e1) {
// TODO Auto-generated catch block
errorTip("The connection with the server is interrupted, please login again");
} catch (IOException e1) {
// TODO Auto-generated catch block
errorTip("The connection with the server is interrupted, please login again");
}
} else {
lblNewLabel.setText("您输入的密码有误!");
textField.setText("");
passwordField.setText("");
textField.requestFocus();
}
} else {
lblNewLabel.setText("您输入昵称不存在!");
textField.setText("");
passwordField.setText("");
textField.requestFocus();
}
} else {
lblNewLabel.setText("您输入昵称不存在!");
textField.setText("");
passwordField.setText("");
textField.requestFocus();
}
}
});
注册 :输入用户名和密码,注册成功后再登录
//注册按钮监听
btnNewButton_1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
btnNewButton_1.setEnabled(false);//设置按钮是否可用
CatResign frame = new CatResign();
frame.setVisible(true);// 显示注册界面
setVisible(false);// 隐藏掉登陆界面
}
});
}
各个区域
// 聊天信息显示区域
JScrollPane scrollPane = new JScrollPane();
scrollPane.setBounds(10, 10, 410, 300);
getContentPane().add(scrollPane);
textArea = new JTextArea();
textArea.setEditable(false);
textArea.setLineWrap(true);//激活自动换行功能
textArea.setWrapStyleWord(true);//激活断行不断字功能
textArea.setFont(new Font("sdf", Font.BOLD, 13));
scrollPane.setViewportView(textArea);
// 打字区域
JScrollPane scrollPane_1 = new JScrollPane();
scrollPane_1.setBounds(10, 347, 411, 97);
getContentPane().add(scrollPane_1);
final JTextArea textArea_1 = new JTextArea();
textArea_1.setLineWrap(true);//激活自动换行功能
textArea_1.setWrapStyleWord(true);//激活断行不断字功能
scrollPane_1.setViewportView(textArea_1);
// 关闭按钮
final JButton btnNewButton = new JButton("\u5173\u95ED");
btnNewButton.setBounds(214, 448, 60, 30);
getContentPane().add(btnNewButton);
// 发送按钮
JButton btnNewButton_1 = new JButton("\u53D1\u9001");
btnNewButton_1.setBounds(313, 448, 60, 30);
getRootPane().setDefaultButton(btnNewButton_1);
getContentPane().add(btnNewButton_1);
// 在线客户列表
listmodel = new UUListModel(onlines) ;
list = new JList(listmodel);
list.setCellRenderer(new CellRenderer());
list.setOpaque(false);
Border etch = BorderFactory.createEtchedBorder();
list.setBorder(BorderFactory.createTitledBorder(etch, "<"+u_name+">"
+ "在线客户:", TitledBorder.LEADING, TitledBorder.TOP, new Font(
"sdf", Font.BOLD, 20), Color.green));
4.聊天 传输文件
public void run() {
try {
// 不停的从客户端接收信息
while (true) {
// 读取从客户端接收到的catbean信息
ois = new ObjectInputStream(client.getInputStream());
bean = (CatBean)ois.readObject();
// 分析catbean中,type是那样一种类型
switch (bean.getType()) {
// 上下线更新
case 0: { // 上线
// 记录上线客户的用户名和端口在clientbean中
ClientBean cbean = new ClientBean();
cbean.setName(bean.getName());
cbean.setSocket(client);
// 添加在线用户
onlines.put(bean.getName(), cbean);
// 创建服务器的catbean,并发送给客户端
CatBean serverBean = new CatBean();
serverBean.setType(0);
serverBean.setInfo(bean.getTimer() + " "
+ bean.getName() + "上线了");
// 通知所有客户有人上线
HashSet<String> set = new HashSet<String>();
// 客户昵称
set.addAll(onlines.keySet());
serverBean.setClients(set);
sendAll(serverBean);
break;
}
case -1: { // 下线
// 创建服务器的catbean,并发送给客户端
CatBean serverBean = new CatBean();
serverBean.setType(-1);
try {
oos = new ObjectOutputStream(
client.getOutputStream());
oos.writeObject(serverBean);
oos.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
onlines.remove(bean.getName());
// 向剩下的在线用户发送有人离开的通知
CatBean serverBean2 = new CatBean();
serverBean2.setInfo(bean.getTimer() + " "
+ bean.getName() + " " + " 下线了");
serverBean2.setType(0);
HashSet<String> set = new HashSet<String>();
set.addAll(onlines.keySet());
serverBean2.setClients(set);
sendAll(serverBean2);
return;
}
case 1: { // 聊天
// 创建服务器的catbean,并发送给客户端
CatBean serverBean = new CatBean();
serverBean.setType(1);
serverBean.setClients(bean.getClients());
serverBean.setInfo(bean.getInfo());
serverBean.setName(bean.getName());
serverBean.setTimer(bean.getTimer());
// 向选中的客户发送数据
sendMessage(serverBean);
break;
}
case 2: { // 请求接受文件
// 创建服务器的catbean,并发送给客户端
CatBean serverBean = new CatBean();
String info = bean.getTimer() + " " + bean.getName()
+ "向你传送文件,是否需要接受";
serverBean.setType(2);
serverBean.setClients(bean.getClients()); // 这是发送的目的地
serverBean.setFileName(bean.getFileName()); // 文件名称
serverBean.setSize(bean.getSize()); // 文件大小
serverBean.setInfo(info);
serverBean.setName(bean.getName()); // 来源
serverBean.setTimer(bean.getTimer());
// 向选中的客户发送数据
sendMessage(serverBean);
break;
}
case 3: { // 确定接收文件
CatBean serverBean = new CatBean();
serverBean.setType(3);
serverBean.setClients(bean.getClients()); // 文件来源
serverBean.setTo(bean.getTo()); // 文件目的地
serverBean.setFileName(bean.getFileName()); // 文件名称
serverBean.setIp(bean.getIp());
serverBean.setPort(bean.getPort());
serverBean.setName(bean.getName()); // 接收的客户名称
serverBean.setTimer(bean.getTimer());
// 通知文件来源的客户,对方确定接收文件
sendMessage(serverBean);
break;
}
case 4: {
CatBean serverBean = new CatBean();
serverBean.setType(4);
serverBean.setClients(bean.getClients()); // 文件来源
serverBean.setTo(bean.getTo()); // 文件目的地
serverBean.setFileName(bean.getFileName());
serverBean.setInfo(bean.getInfo());
serverBean.setName(bean.getName());// 接收的客户名称
serverBean.setTimer(bean.getTimer());
sendMessage(serverBean);
break;
}
default: {
break;
}
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
close();
}
}
赵洲
心得:
用Java解决实际问题,分析问题是至关重要的。分析要合理、全面,只有这样,划分的类就不至于过大或过小。一个复杂的问题,就象这个聊天室吧,一开始不是什么都会做,先就完成简单、容易的,然后再带着小有的成就感,去征服难弄的部分。这种思想是处处适用的。
学习Java这段时间,有时候会觉得有点苦,但是我觉得正是有了你奋斗时的苦,才能换来学成后的甜。当你经过认真写代码做完一个项目时,你会有一种成就感。心里有一种说不出的喜悦之情。
邱鑫良
心得:对学习编程来说,不要求英语,但不能一点不会,。最起码像JAAPI文档这些东西还是要能看懂的,连猜带懵都可以;旁边再开启一个‘金山词霸‘。看多了就会越来越熟练。在学JA的同时学习英文,一箭双雕多好。另外好多软件需要到英文网站下载,你要能够找到它们,这些是最基本的要求。英语好对你学习有很大的帮助。
学习Java靠得是韧劲,靠得是拼劲,考得是坚持不懈。如果做好了这几点,我想Java对你来说不会太难。还有,你自己要有信心,相信自己能学会。以上就是我在学了Java后的一些感言。
陈朗
心得:通过这次实训,我真的从中学到了很多东西。我对这个介于人类与非人类之间的计算机编程语言有了较上学期更进一步的认识。其间开心过、郁闷过、无奈过、彷徨过……随着实训的圆满成功与实验报告的顺利完成,有点微微的自豪感使人难忘。至于我做的程序,还不是很完善,所以我将一直去完善它,不断地学习下去。伴随着学习的深入,我发现高深的东西还有很多很多,等待着我自己去发掘。对于Java语言,我会更加努力。
王泽鑫
心得:在我所学的语言当中,我自认为JA是一门比较强大的面向对象的编程语言,不仅仅因为它的跨平台性,更多的是因为它的灵活多变
和实用性较强,可以说比较的经典和强悍。所以学好java语言有很大的用处,这次实训,我们更多学到的是不懂就问和自己应该尽自己的全力去尝试,哪怕失败,只要自己尽自己的全力,和身边同学一起探讨而不是抄袭,团结合作,发挥团队意识,最后在自己的努力下,终于运行成功,这种成就感美不可言,心情愉悦至极。
原文:https://www.cnblogs.com/520530zhao/p/13225000.html