今天,我们的F(x)聊天室1.0版本终于出炉了。虽然花费的时间远远超出预期,最终结果也有点牵强(界面粗糙、功能简单),但是还是挺激动的。
一、 项目简介
1、 项目名称:
F(x)聊天室
2、 项目成员及分工:
服务器(XM)
客户端(本人)
3、 通信协议:
XMPP协议
4、 项目时间:
2011年8月6日—2011年10月7日
二、 主要功能
1、 注册(通过用户名和密码注册,用户名不可以重复)
2、 登陆(通过号码和密码进行登录)
3、 好友列表(用户成功登陆后接收服务器发来的好友列表,并显示)
4、 查找、添加好友(通过号码进行查找,ps:只有好友在线才能查找成功)
5、 聊天(好友之间可进行聊天)
6、 发送文件
7、 提示好友上下线(只提示好友的,不提示自己的上下线)
三、 实现难点(ps:仅限于我写的客户端)
1、 项目类图的设计:
这样一个通信项目,究竟需要多少类组成,每个类都承担什么功能,其实最初还是很难预料的,一片迷茫。随着设计模式和代码质量的学习,思路渐渐清晰。如果把类分类的话,一共有三种包:
消息包:是所有消息的定义类
工具包:存放程序需要使用的类和函数,如消息打包、解包的类 ,输出日志消息的类,还有解析消息、读取字符串的 函数组装的类等等
界面包:主要的项目的界面显示类及与服务器连接的类
运用“事件监听”模型,使通信和界面分开,降低代码的耦合度
2、 好友列表
其实注册、登陆消息都还好,客户端与服务器连接的时候很容易就连通了,就是好友列表,有点纠结。
一开始定义的是:用户登录后服务器不给用户发送好友列表,所以最初登录时用户树的子节点是空的,只有添加好友成功后服务器才会给双方发送好友列表消息。由于服务器的问题,只能给一个用户发送好友列表,给另一个发送时总是出现空指针异常,导致项目卡在这里很长时间。我调试的时候,大多数情况下只收到一条好友列表消息,但偶尔又能正确收到两条好友列表消息,这种若隐若现的bug真让人头疼。最后发现,用户信息保存在一个map中,之前添加好友时用的迭代器遍历整个map,就是最后这iterator.remove();出现的问题,把这行注释掉之后好友列表就能正常显示了。我也不确定究竟是不是这里的问题,之前少数几次好友列表的正常显示也让我百思不得其解。后来将好友列表消息小小修改了一下,就是用户登录时服务器就发送好友列表
//得到在线用户的迭代器
Set<UserInfo> set = getUsMap().keySet();
Iterator<UserInfo> iterator = set.iterator();
//向接受者(此接收者必须要在线)发送消息
while(iterator.hasNext()){
UserInfo userInfo = iterator.next() ;
if(recNumber == userInfo.getNumber()){
ServerThread st = getUsMap().get(userInfo);
st.sendMsg(msg);
break;
}
// iterator.remove();
}
3、 传文件
其实,文件的传送也是这个项目中比较失败的地方,惭愧!一开始文件内容定义的是String类型,测试的时候用txt测试,很简单就通过了,但是传图片的时候就会出现乱码。我又把文件内容改成byte[]类型的,可是传文本文件的时候都是乱码,其实也不算是乱码,是类似于[B@de6ced的东西。整个流程就是:发送的是xml+byte[]类型的消息,本质上还是String字符串,读取的时候将文件内容解析成String,再转换成byte[],就是乱码了。这个流程有问题,想想也真是自找麻烦,可能是String与byte[]数组转换的问题,也可能是读取消息是解析的问题。所以总的来说,这个文件传送很失败。这时才感觉当初选择XMPP协议真的是不太明智,其实并不是XMPP协议的问题,而是自己解析消息的方法有很大局限性,希望以后能有所改进。
4、 界面的设计(给Jpanel添加背景图片)
以前界面的设计都是Jframe有还几个Jpanel组成,有的Jpanel专门贴图片(贴图的方法是用JTextArea),有的专门放置按钮等组件,但是这样一来界面就显得分离,按钮面板的背景只能用Jpanel的setBackground()来设置,但是只是几种单调的颜色,很难满足。后来上网查了很多资料,为Jpanel设置背景图片,最后还是继承Jpanel类并重写了paintComponent()方法才行。思路本不难,但是一劳永逸啊,以后往界面上贴图片就不愁了。
四、 有待改进的地方
服务器:
1、 现在服务器的用户信息保存在文件中,导致每次重启服务器后用户都要重新注册,以后升级的话打算连接上数据库,永久保存用户信息。
2、 服务器查找用户的效率问题
3、 消息转发的优化
……
客户端
1、 文件发送的优化(可能要改通信协议或解析的方法)
2、 表情的发送
3、 远程控制的实现
4、 删除好友功能的实现
5、 还有很多设计不人性化……
五、 项目小结
项目的最终结果虽然有点不尽人意,但是在做项目的过程中收获颇丰,在写客户端的代码期间没太大感觉,可是真正与服务器连接调试的时候,发现自己又出现了一种新的状态,很好的状态:一个人不断的连接调试,出现问题、找问题、解决问题,写程序真的是种体力活,但是自己越来越能沉浸到程序中去了,出现问题也不再像以前那样茫然无措,而是分析出问题的各种原因,并解决问题,实在无能为力就百度。也就是能沉下心去做一件事了,曾经连着几天空闲时间都沉浸在项目中,一扫暑假集训的不好状态,很充实,虽然现在可能没有那种拼劲儿了,但是努力过,就能坦然面对结果。
下面贴几张图片吧:
分享到:
相关推荐
用jsp写的聊天室,仅供学习参考。更多内容参考:http://blog.csdn.net/qq_19558705
【聊天室项目设计】 在IT领域,开发一个聊天室项目是一项常见的实践任务,它涉及到网络编程、多线程处理、数据库交互等多个核心技术。本项目基于Java语言进行开发,并且使用MySQL作为后台数据支持,旨在提供一个...
聊天室正常聊天 用户注册 添加和搜索好友功能 在服务器端实现了数据库查询,并将用户信息都保存在数据库 能够远程执行cmd命令,并且有命令回显 用户可以一对一私聊 能给服务器发送文件 客户端由pyhton编写
总结来说,这个“聊天室”项目为我们提供了一个学习和实践Java网络编程、多线程处理以及用户界面设计的好机会。通过这个项目,我们可以掌握Java Socket的基本用法,并能将其应用到更复杂的网络应用程序开发中。
【Java聊天室项目】是一个基于Java技术实现的实时通信应用,旨在帮助学习者理解网络编程、多线程以及用户交互等核心概念。本项目通过一系列的视频教程,逐步引导学习者构建一个完整的在线聊天室系统,使用户可以进行...
【标题】"聊天室基础项目资料_socket聊天室_聊天室_java项目_socket_" 涉及的是基于Java的Socket编程技术,用于实现一个TCP/IP通信的即时聊天室。在这个项目中,开发者将学习如何利用Java的Socket类来创建客户端和...
在这个“udp实现聊天室项目”中,我们主要探讨的是如何利用UDP(User Datagram Protocol)协议构建一个具有注册、登录、群聊和私聊功能的在线聊天室。UDP是一种无连接的传输层协议,它不保证数据包的顺序、可靠性和...
关于JAVA开发的一个局域网聊天工具,这是总结PPT,对初学者或许有些帮助
上嵌网络编程聊天室项目
【标题】:“聊天室项目聊天室.tar.gz”是一个基于C/C++编程语言并利用Qt框架构建的局域网聊天室应用程序。这个项目旨在实现多用户之间的实时通信,包括文本聊天、文件传输以及自定义聊天界面皮肤等增强用户体验的...
项目描述: 属于用JAVA实现基于C/S模式的聊天室系统,该聊天室分为客户端,服务器端和聊天界面三个模块。服务器端实现侦听来自客户端的请求,并显示在线人数。客户端实现登陆,检查,注册,功能。聊天界面实现了显示...
标题中的“一款Qt制作的聊天室项目”表明这是一个使用Qt框架开发的聊天应用程序。Qt是一个跨平台的应用程序开发框架,适用于多种操作系统,如Windows、Linux、macOS等。它提供了丰富的图形用户界面(GUI)组件和工具...
《Java程序设计实训》报告的主题是构建一个多人聊天室,旨在通过这个项目加深对Java语言的理解,特别是Java的多线程、GUI编程以及Socket网络编程技术。以下是对这些知识点的详细说明: 1. **Java语言**:Java是一种...
在这个聊天室项目中,Mysql可能用于存储用户信息、聊天记录等数据,确保数据持久化,即使服务器重启,也能恢复聊天历史。 【C++相关操作】指的是服务器端使用C++语言进行编程。C++是一种强大且灵活的编程语言,适合...
【标题】"自己写的java局域网聊天室(带项目报告)" 描述了一个基于Java实现的局域网聊天室项目,该项目包含了服务器端和客户端的实现,支持多人聊天和私聊功能。开发者通过这个项目,显然掌握了Java网络编程、多...
【JAVA简单WEB聊天室项目】是一个基础的网络应用程序,它主要使用了JAVA技术栈来实现。这个项目旨在帮助初学者理解和实践WEB项目的开发流程,同时为有经验的开发者提供一个快速搭建简单聊天室的模板。它涉及到的关键...
在这个“聊天室x_socket聊天室_java线程_聊天室_stuchatroom_ideajava聊天室_”项目中,开发者利用了Java的Socket库来创建一个简单的多人聊天室。这个聊天室不仅展示了Socket通信的基本原理,还引入了多线程技术来...
在本Java聊天室项目中,开发者提供了一个适合新手学习或作为期末作业的实践平台。这个项目不仅包含了完整的源代码,还附带了详尽的说明文档,帮助用户理解和操作。以下将详细介绍该项目的关键知识点和重要组成部分。...
服务器:本项目为典型的基于TCP的C/S模式的网络应用程序。三个大模块分别为Client,Server,自定义协议支持库,本人主要负责Server模块。 客户端:Client进程主体采用多路复用(Select)技术实现,同时监控Socket和...