这次聊天室项目,是进培优班以来第一个小组项目.要求是用swing(没学过,自行百度)写一个聊天室.对我来说也算是对java基础部分的一个总结吧.感觉基本上java基础学到的东西都用上了.
因为swing我也不懂,也没兴趣去搞这个过时的技术.我就完全没有关心了.我主要负责的是聊天室后台服务器方面的事情.接下来总结一下学到的东西.
1. 一开始我是准备使用String来当作客户端和服务器的传输介质的…通过程序来拼接关键字,然后客户端和服务器分别解析String来获取需要的信息…比如说用@符号来表示消息类型,然后用#号来分割发送元素,比如说时间和聊天内容.
但是后来在刘璞和百宝箱的强烈反对下改用了一个chatbean,一个对象.这个对象使用一个int type来区分消息类型,包含整个程序所有需要的消息类型.通过不同的type放入不同的内容,然后通过getSet方法来直接获取.
这个算是学到了,确实比String方式要好很多,但是局限是只有同是java程序才能使用序列化来传输.
chatbean代码如下
package function;
import java.io.Serializable;
import java.util.HashSet;
/**
* 数据传输协议类
* @author 璞
*
*/
public class ChatBean implements Serializable {
//chatBean 版本:1.0
private static final long serialVersionUID = 1L;
/*(1,2,3属于客户端发送给服务器格式)
* type=1 表示 userNmae和passWord(登录时发送)
* type=2 表示 MSGtarget(单人模式和群聊模式切换的时候发)
* type=3 表示 contant(发送聊天内容)
*
* (4,5属于服务器发送给客户端格式)
* type=4 表示 content ,time和fromName(聊天内容,时间,和来自谁)
* type=5 表示 onlineList (在线用户列表,每当有用户上线或下线服务器对所有人广播更新)
* */
/*
* 客户端发送:
* type=1 : username + password (登录界面做)
* type=2 : username + password (注册界面做)
* type=3 : name + time + message (上线,下线,广播 默认设置为@public ;私发为人名)
* type=4 : target 广播@public ;私发为人名
*
*
* 客户端接收:
* type=5 : boolean值,用于判断数据库操作是否成功
* type=6 :name + time + message 接收消息
* type=7 : onlineList 在线用户列表
*/
private int type;
private String userName; //用户名
private String passWord; //密码
private boolean ok; //判断数据库操作是否成功
private String message; //聊天内容
private HashSet<String> onlineList; //在线列表
private String fromName; //发送方昵称(尚未实现)
private String time; //时间
private String MSGtarget; //接收方
public boolean getOk() {
return ok;
}
public void setOk(boolean ok) {
this.ok = ok;
}
2. 然后就是关于程序构架方面,真的很重要…我一开始直接把存储Socket的线程直接存储在集合中.后来发现不行,改了一个需求…就是我们要私聊的时候给不在私聊状态的人发送一个消息,提醒他接收到一条私聊消息…但是我却发现现有构架这个功能加不进去.或者说太费力了…
然后在思考了整整1个小时候推翻了一大半代码全部注释掉,把所有容器的存储对象改为了线程账号唯一对应的ID,一个int值.
然后我发现一个程序写了很久以后,要加功能真的非常麻烦…如果一开始没有预留可拓展空间要加东西真的有种无从下手的感觉哦…以前一直是看论坛上大家说看到垃圾代码烦的要死,重构重构…没有切身体会,这次算是真实体验到了一个程序的可拓展性真的很重要哦.
后期发现BUG,比如说聊天历史记录部分,在一开始的时候只考虑了存储和获取.但是发送消息部分要如何区分不同的历史消息没有一个清晰的思路.在后面写的时候,我好像写了无数个IF,调试了一个晚上才调通…然后,我再也不想碰这段代码…阿西吧….
如果一开始没考虑拓展性后期真的是想死啊….
3. 顺便.写代码的时间和调试bug的时间占比好像是1:3…如果一开始就把框架和各种细节想好,应该只会略微增加写代码的时间,大幅减少调试的时间…
4. 第一次完整的走完一个项目,感觉真的学到了好多…各种细节,switch case,for循环,多线程,生产者消费者模式,集合包装…理解了好多东西,好像把大量的细碎的东西串联在一起了.一下子想不起来太多了,暂时先写这么多吧.
------------------------------------------然后贴一点代码上来吧:千多行有点多,就不全贴了.
1.最重要的线程类
package function;
import java.io.IOException;