`
XY1991
  • 浏览: 36162 次
  • 性别: Icon_minigender_2
  • 来自: 长沙
社区版块
存档分类
最新评论

f(x)聊天室项目总结

阅读更多
今天,我们的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、 还有很多设计不人性化……

五、 项目小结
项目的最终结果虽然有点不尽人意,但是在做项目的过程中收获颇丰,在写客户端的代码期间没太大感觉,可是真正与服务器连接调试的时候,发现自己又出现了一种新的状态,很好的状态:一个人不断的连接调试,出现问题、找问题、解决问题,写程序真的是种体力活,但是自己越来越能沉浸到程序中去了,出现问题也不再像以前那样茫然无措,而是分析出问题的各种原因,并解决问题,实在无能为力就百度。也就是能沉下心去做一件事了,曾经连着几天空闲时间都沉浸在项目中,一扫暑假集训的不好状态,很充实,虽然现在可能没有那种拼劲儿了,但是努力过,就能坦然面对结果。

下面贴几张图片吧:



分享到:
评论
2 楼 puqiyue 2011-12-08  
求源码   www.815107057@qq.com  谢谢
1 楼 wuanjunbaiqi 2011-10-07  
这图片好漂亮啊

相关推荐

Global site tag (gtag.js) - Google Analytics