`
Coco_young
  • 浏览: 125885 次
  • 性别: Icon_minigender_1
  • 来自: 湖南长沙
社区版块
存档分类
最新评论

通信——实现多人聊天室

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

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

2.聊天界面:




三.总结
学到的知识点:
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的精神!

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


 
  • 大小: 27.5 KB
  • 大小: 12.7 KB
  • 大小: 27 KB
4
0
分享到:
评论
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.
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。

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;
}
第三个端口号打印不出来

相关推荐

    PHP实例开发源码——中龙多人视频聊天室源码.zip

    【PHP实例开发源码——中龙多人视频聊天室源码.zip】是一个包含了PHP技术实现的多人视频聊天室的完整源代码。这个项目旨在提供一个基于Web的实时通信平台,允许多个用户通过网络进行音视频交流。以下是这个源码包中...

    socket+gui实现多人聊天室

    本项目标题为“socket+GUI实现多人聊天室”,这意味着我们将探讨如何利用socket编程技术和GUI库来创建一个支持多用户实时交流的平台。 首先,让我们了解核心组件——socket。Socket是网络通信的基础,它提供了进程...

    多人聊天室代码(mysql以及redis简单应用)

    《多人聊天室代码实现——基于MySQL与Redis的简单应用》 在信息技术日益发达的今天,实时通讯成为了一项基本需求,多人聊天室便是其中的重要应用场景。本项目将介绍如何在Linux环境中利用MySQL和Redis构建一个基础...

    VC实现多人在线的网络聊天室——服务器

    实例308——多人在线的网络聊天室——服务器中的源代码应包括以下主要部分: - 主函数:初始化Winsock,启动服务器监听。 - 连接处理函数:负责接受新的客户端连接,并创建新线程处理通信。 - 通信处理函数:在新...

    ASP实例开发源码-随风ASP多人聊天室源码.zip

    这个实例开发源码——随风ASP多人聊天室,提供了一个实际应用ASP技术的例子,可以帮助学习者深入理解ASP的工作原理以及如何用它来构建实时通信功能。 首先,ASP的核心是VBScript(Visual Basic Scripting Edition)...

    android 单人聊天多人聊天室+文件传输

    总结,"androididimASmack"项目很可能是使用Smack库来实现Android上的即时通讯应用,包括单人聊天、多人聊天室以及文件传输功能。通过理解并熟练运用Smack库提供的API,开发者可以构建出高效、安全的IM应用。在实际...

    Java课设,实现了单人聊天和多人聊天.zip

    【Java课程设计——单人与多人聊天应用】 本Java课程设计实现了一个聊天应用程序,涵盖了单人聊天和多人聊天的功能,适合用作毕业设计项目。该项目提供了完整的源代码,包括项目说明文档,确保在Window 10/11操作...

    javaWeb(四个范围)实现聊天室功能(群聊+私聊)

    在这个项目中,"javaWeb(四个范围)实现聊天室功能(群聊+私聊)"主要是利用了JavaWeb的四个作用域——Page、Request、Session和Application,来实现用户之间的即时通信。下面将详细解释这些知识点。 1. **Servlet...

    VC中MFC 网络聊天室程序

    经典教程中的网络聊天室程序源代码,服务器端设置后,可实现多人登陆聊天室聊天功能,完美实现,肯定是初学网络套接字编程者的首选。

    多人聊天程序课程设计报告d.doc

    多人聊天程序是一个典型的客户端-服务器(C/S)架构的软件应用,通常用于实现多个用户之间的实时交流。在本课程设计报告中,李旭坤同学详细阐述了如何使用Java语言开发一个多人聊天系统,涵盖从需求分析到代码实现的全...

    随风多人聊天室 1.1

    随风多人聊天室1.1是一款专为用户提供实时交流平台的应用程序,主要应用于客服或社交场景。该版本的更新重点在于提升系统性能和用户交互体验,通过改变聊天数据的储存方式,增强了系统的处理能力和响应速度。 首先...

    基于.NET/C#平台socket技术开发的一个多人在线聊天室系统(WinForm)

    - Code:这是源代码文件夹,里面应该有项目的C#源代码,我们可以在这里找到实现聊天室功能的具体逻辑,包括Socket通信、消息处理、用户管理等部分。 - Publish:发布文件夹,通常包含编译后的可执行文件和其他运行所...

    用CSocket类实现的聊天室程序

    使用CSocket类,我们可以轻松地创建一个支持多连接的服务器,每个连接对应一个客户端,从而实现聊天室的多人聊天功能。 构建聊天室程序的关键步骤包括: 1. **服务器端**: - **初始化Winsock**:调用`WSAStartup...

    vc-基于MFC编程,使用TCP/IP模型编写

    在本文中,我们将深入探讨如何使用Microsoft ...在多人聊天室项目中,这种结合不仅实现了基本的通信功能,还考虑了安全性、并发处理和用户体验等多个方面,是学习网络编程和MFC应用开发的一个很好的实践案例。

    《Visual C++范例大全》随书光盘 第十四章

    实例308——多人在线的网络聊天室(服务器) 实例309——多人在线的网络聊天室(客户端) 实例310——CS结构点对点信息交互系统(服务器) 实例311——CS结构点对点信息交互系统(客户端) 实例312——使用...

    最最简单的纯servlet聊天室

    【描述】"我学习servlet时做的最简单的聊天室,实现多人聊"表明了该聊天室功能的核心——多用户交互。在Servlet环境下,通过HTTP请求和响应来处理用户的聊天消息。每个用户发送的消息都会广播给所有在线的用户,实现...

    c++网络聊天室代码

    在信息技术领域,网络通信是不可或缺的一部分,而C++作为一门强大的系统级编程语言,常被用于构建高效的网络应用,例如本文将要讨论的——C++网络聊天室。这个项目的核心在于实现客户端与服务器之间的实时数据交换,...

    MFC课程设计报告(聊天室系统)

    总结,这个MFC聊天室系统项目展示了如何结合WINSOCK和MFC来构建一个基本的网络聊天应用,提供了客户端与服务器之间的通信机制,实现了多人聊天的基本功能。在实际操作中,这涉及到网络编程、多线程处理以及用户界面...

    Android中基于XMPP协议实现IM聊天程序与多人聊天室

    服务器下的客户端也可以通信,XMPP的前身是一个开源组织制定的网络通信协议——Jabber,XMPP的核心是在网络上分片段发送XML流的协议,这个协议是XMPP的即时通讯指令的传递手段。  为了防止服务器间发送的数据被篡改...

Global site tag (gtag.js) - Google Analytics