首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

通讯——实现多人聊天室

2012-12-18 
通信——实现多人聊天室前几天把多人聊天室写完了(也算是照本宣科吧),今天一回想整个多人聊天室的代码,发现

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

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

2.聊天界面:




三.总结
学到的知识点:
1.对一些Swing组件的使用,如:JTable,PopupMenu。
2.提高自己异常处理的能力,比如:在服务器被关闭时,应该先断开与所有用户的连接,
代码如下:

// 设置监听器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的精神!

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


  1 楼 25262875 2011-09-20   您好楼主,我下来试了试,服务器启动不了。不知道是我JDK版本问题还是什么
// 对命令做出处理
if (cmd.equals("setup")) {
// 获得端口号
String port = port_jtf.getText();
System.out.println("1:"+port);
sc = new ServerCreator(Integer.valueOf(port));
System.out.println("2:"+port);
sc.start();
System.out.println("3:"+port);
System.out.println(sc.isRunning());
stop_btn.setText("停止!");
stop_btn.setActionCommand("stop");

} else if (cmd.equals("stop")) {
// System.out.println("stop!");
ChatTools.clearClient();// 清空用户队列
sc.stopServer();
stop_btn.setText("启动!");
stop_btn.setActionCommand("setup");
sc = null;
}
第三个端口号打印不出来 2 楼 Coco_young 2011-09-20   25262875 写道您好楼主,我下来试了试,服务器启动不了。不知道是我JDK版本问题还是什么
// 对命令做出处理
if (cmd.equals("setup")) {
// 获得端口号
String port = port_jtf.getText();
System.out.println("1:"+port);
sc = new ServerCreator(Integer.valueOf(port));
System.out.println("2:"+port);
sc.start();
System.out.println("3:"+port);
System.out.println(sc.isRunning());
stop_btn.setText("停止!");
stop_btn.setActionCommand("stop");

} else if (cmd.equals("stop")) {
// System.out.println("stop!");
ChatTools.clearClient();// 清空用户队列
sc.stopServer();
stop_btn.setText("启动!");
stop_btn.setActionCommand("setup");
sc = null;
}
第三个端口号打印不出来


您好,我把你的代码贴到我的程序中去运行了一下,在控制台的输出结果如下(输入的端口号为9090):
1:9090
2:9090
3:9090
如果随便输入一个端口号(0-65535)的话,由于客户端那边的代码已经限定死了,只有服务器的端口号为9090(只是作为练手,图个方便,其实可以做的更好)时才能连上,不过就算输入其他的端口号在第3个地方还是会打印出端口号,不至于发生你讲的情况。你可以看看是不是其他的地方的问题引起的,或者是JDK版本不对(我的是jdk-6-windows-i586)。实在不行可以加下QQ。

3 楼 Coco_young 2011-09-21   25262875 写道您好楼主,我下来试了试,服务器启动不了。不知道是我JDK版本问题还是什么
// 对命令做出处理
if (cmd.equals("setup")) {
// 获得端口号
String port = port_jtf.getText();
System.out.println("1:"+port);
sc = new ServerCreator(Integer.valueOf(port));
System.out.println("2:"+port);
sc.start();
System.out.println("3:"+port);
System.out.println(sc.isRunning());
stop_btn.setText("停止!");
stop_btn.setActionCommand("stop");

} else if (cmd.equals("stop")) {
// System.out.println("stop!");
ChatTools.clearClient();// 清空用户队列
sc.stopServer();
stop_btn.setText("启动!");
stop_btn.setActionCommand("setup");
sc = null;
}
第三个端口号打印不出来
补充一下QQ是:372362195.

热点排行