Ø背景:JAVASE 第二阶段项目《局域网聊天工具》完成

Ø作者:$$$

Ø时间:2013-08-01

Ø为什么写这篇总结

这次的项目花了两周的时间,最后也是赶着来不及完成全部的功能,但是大部分功能已经是实现。在完成整个项目的过程中遇到很多问题,直到后面不仅不想写甚至都不敢写,为什么会这样呢?这个项目很值得反思和总结,我相信我会懂得更多,也会有一个小的飞跃。

Ø项目功能介绍

实现注册,登录,查找好友,单聊(添加好友,删除好友,查看并修改详细信息,查看聊天记录,聊天{
在线信息,在线未读信息提醒,离线信息},改变字体,发送文件,发送声音),群聊(与单聊类似)等。

Ø项目使用的技术和知识

项目采用到的技术包括:JAVA-IOjava多线程,java xmljava网络通信(socket),java图形编程,javaswing,事件,监听等。

Ø项目完成之后的总结与反思:

ü弄清楚项目需求,做好计划和理清项目的实现方式及设计

在做每一个项目之前,这些准备工作是至关重要的,以前都是马虎对待,想到什么就写什么,可是在项目的具体编写过程中就会出现各种各样的问题。(1-2天)

ü分工明确,模块化:客户端进行人机交互,服务器负责处理由客户端发送过来的信息或转发或存储或修改。整个项目都是围绕着这个基本思路进行的。

ü统一架构:在客户端与服务器进行消息的交互时,涉及到协议的问题也就是客户端与服务器之间交互的信息的格式问题,这个要进行统一格式否则很容易出现混乱和错误,特别是采用字符串切割的情况。

ü写好注释:在这个项目中,因为之前没有想好,代码修改的频率非常高,而这样代码的注释就展现出其重要性了,特别是越大的项目,注册更是必须的,这个习惯也是要引起重视,良好的注释不仅让看代码的人更好理解,而且也能让自己更快的反应过来,在修改或复用的时候就更容易点。

ü小心修改:一个项目在完成的过程当中难免会改代码,而改代码必须小心,否则会出现自己想不到的错误,特别是对代码还不是很熟悉的情况下。

ü编程过程中的思维很重要,有清晰的好的思路才能做出好软件,这点我明显没优势。

Ø项目过程中各模块的回顾(问题):

l项目开始时没有头绪,这时就写了界面(登录,注册,设置等),界面最难把握的是界面的布局问题,究竟选用什么布局(FlowlayoutBorderLayoutGridLayout,)才会好看总是让我头疼。

l登录注册模块的实现:此时要判断用户的输入是否合法,判断用户名是否可用。除了用户名的判断要交由服务器(失去焦点时产生socket)处理,其他的都是在本地判断,如果用户的输入都合法(全部输入,变量记录合法与否)才产生socket与服务器通信,交由服务器处理。【此处就开始涉及客户端与服务器间信息交互的格式,在开发的前期由于对项目没做好充分准备,在格式上改了改,吃大亏了。登录和注册是独自跟服务器通信的,此处的格式为login/register:】

l用户登录成功到主界面,主界面的好友,群,设置面板采用JList,以前很少用,所以也折腾了一下。

l好友模块:涉及查找好友(find:),删除好友(delete:),添加好友(add:),好友聊天(word:)。

l好友聊天的实现:客户端和服务器各开启一个专门读取信息的子线程。此时又有问题,因为是采用切割字符串的形式(使用:符号)以及采取BufferReaderreadline()方法,如果处理不当就会出现换行符和:符号的混乱情况,也会导致程序的运行错误。对于:符号的处理,采用String的分段切割即split(“”,int);而换行符可以将其先转换成不可显示的字符,到达好友时,则把字符转换回来,(我这里只是加进一个键盘Enter的监听,让其按下Enter键时就发送,不过如果是复制的字符串中包含换行符情况就不行了)。

l聊天消息的显示问题:分为在线在聊,在线未读和离线三种状态。我在服务器那边设计一个链表(hashmap)用来存储登录上来的用户名和对应的Socket,一旦存在该链表中的用户就是在线用户,否则就转入离线信息的存储流程,如果在线服务器将信息转发给好友,而且在好友端也有一个链表用来判断好友的聊天是否打开,打开则显示,未打开则显示未读信息的条目(画string上去)。

l关于信息的存储:项目的存储采用XML技术,不得不说挺烦的,不过仔细想一想也就那几步。XML中设计数据结构的设计(第一次感觉到数据结构也是重中之重的),结构以一个用户作为基本块,User下面包含namename2(昵称),sex等基本信息,而作为群的部分,则应该把群也作为一个独立的基本块,而不将其放在User里,这样对群的处理就方便许多。除了在服务器端有存放各个用户的信息外,每个客户端也应有各自的存储文件用来存储相关的信息和聊天记录。

l用户登录请求相关的信息:在用户登录的时候,一旦服务器验证通过,那么下一步就是把该用户的相关信息(可将全部的信息返回,写入本地,之后根据版本判断是否进行数据的更新,这真是个好办法,省的再进行数据的拼接以及切割,只可惜没付诸行动)返回给用户。

l关于发送表情,发送文件:聊天窗口中如果使用JTextArea是不能显示头像的,因为他是纯文本的,可采用JTextPane。而发送二进制文件则是涉及JAVA IO流的选择。

Ø开发过程中出现的现象

ü总的来说,本次项目开发可分为三个阶段:准备阶段(不知道如何入手,没有思绪)/中期阶段(基本的思路已经有了,一步步的前进)/后期阶段(时间不够,厌倦那繁琐的操作,不想写甚至害怕去写)——在后期赶时间的状态下,很难把项目做好,那种感觉真是糟糕透了。#一个张弛有度,积极向上,人性化的环境或文化是至关重要的,选择走长远的而不是看中短期的效益#

Ø有待深入学习的知识:

JAVA IO流发送二进制文件,JAVA多线程。