通信——实现多人聊天室

前几天把多人聊天室写完了(也算是照本宣科吧),今天一回想整个多人聊天室的代码,发现沉淀下来的东西并不多,所以觉得得好好总结下!
首先可以分析一下下,多人聊天室是如何进行通信的 ,用户通过客户端把消息发送到服务器上,然后再由服务器转发给所有的人,这就是多人聊天室的通信过程(从这里可以体会到,服务器要负责去处理数据,而客户端只要负责接收和发送消息就可以了)。
为此,自然要把服务器和客户端都写好。
一.服务器端:
功能介绍:
1.能够启动和暂停服务器。(这就要求服务器处于独立于主线程之外的线程中)
2.能够向用户发送通知,私人信息,以及转发用户发来的信息。
3.能允许多个用户同时接入。(这就要求必须使用独立的线程来处理每一个接入的用户)
4.能够显示当前接入的用户的信息。
5.能够踢掉当前在线的用户。
大体界面如下:

[img]http://dl.iteye.com/upload/attachment/556945/939304eb-9696-30a3-af2a-ec5d37ac3e3a.jpg[/img]

二.客户端:
功能介绍:
能发送和接受消息。
运行界面:
1.登录界面:

[img]http://dl.iteye.com/upload/attachment/556956/203ee856-fb2b-3966-ab8c-10fb4b9e2438.jpg[/img]
2.聊天界面:


[img]http://dl.iteye.com/upload/attachment/556958/64b2968a-a9be-3808-824e-0ba6aaf6ec45.jpg[/img]

三.总结
学到的知识点:
1.对一些Swing组件的使用,如:JTable,PopupMenu。
2.提高自己异常处理的能力,比如:在服务器被关闭时,应该先断开与所有用户的连接,
代码如下:
// 当服务器关闭的时候 需要断开所有与客户端的连接
server_frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
//如果服务器处于运行状态,需要断开连接
if (sc!=null&&sc.isRunning()) {
// 清空用户队列,停止服务器的工作
ChatTools.clearClient();
sc.stopServer();
}
server_frame.setVisible(false);
System.exit(0);
}
});

在用户关闭客户端时,应该断开和服务器的连接,代码如下:
//当关闭客户端的时候,要断开和服务器的连接
chat_jf.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {

String CLOSE = "bye";//发送bye就可以了
cc.sendMsg2Server(CLOSE);

chat_jf.setVisible(false);
System.exit(0);
}
});

在服务器T掉客户端时,使用try_catch结构进行异常处理,代码如下:
try {
String msg = reader.readLine();// 外接强行关闭客户端时,一定会抛出异常,这个问题怎么解决比较好
return msg;
} catch (Exception e) {
//给出异常信息
//当服务器暂停或者把客户端踢掉的时候都会抛出此异常
UserInfo user = this.getUserInfo();
System.out.println("已经与"+user.getUserName()+"断开了连接!");
}
String MSGREADFAIL = "null";
return MSGREADFAIL;

总之,对于异常这个东西,能让它不报,当然是最好的,如果它必须要报出来,那么我们就用try_catch结构进行处理,给用户一个错误提示信息而不是把一堆英文打出来给用户看。
3.对于任何一个软件的开发,要去分析类的数量,各个类的功能,以及类之间的相互调用关系,进行编程实现的时候,先从与外界联系最少的类开始写。
4.对于客户端和服务器而言,它们进行通信,发送消息的格式必须相同,否则无法正确接受信息。(在本例中,对于发送的字符串,必须在结尾处加上"\r\n")
5.常用如下的方法为组件添加监听器:
// 设置监听器
send_btn.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {
String msg = jta_output.getText();
cc.sendMsg2Server(msg);
jta_output.setText("");
}

});


自身的不足:
1.对问题的分析能力还是不够,比如就这个多人聊天室的服务器端,客户端的通信流程的分析就不好,以及对服务器端类的结构分析也不清楚。
2.自己对知识的沉淀能力也不够,经常是忘这忘那,主要还是缺乏一种write down的精神!

最后一句是对自己的寄语:路漫漫其修远兮,吾将上下而求索!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值