java实战——网络聊天室
因特网已经成为了人们交流的海洋,上网的用户越来越多,更多的人愿意使用网络来认识别人,了解别人,这就是当下诸如qq、微信等聊天工具火热的原因。
我们虽然不能立马就开发出来一个像上述两个一样功能强大的聊天室,但我们可以自己制作一个简单的聊天室。
我们采用传统的Client/Server结构,功能类似于Web聊天室,用户可以在聊天室内公开发言,也可以发送给某个用户实现私聊。架设好服务器,用客户端软件登录上服务器就可以聊天了。
先简单介绍一下RMI吧,RMI是从java1.1就已经有了,是一种调用远端主机上方法的技术使得分布在不同虚拟机中对象的外表和行为都像本地对象一样。
RMI主要有以下优点:
1.面向对象:RMI可将完整的对象作为参数和返回值进行传递,而不仅仅是预定义的数据类型。也就是说,可以将类似java哈希表这样的复杂类型作为一个参数进行传递。
2.设计方式:对象传递功能使用户可以在分布式计算中充分利用面向对象技术的强大功能,如二层和三层结构系统。
3.安全:RMI使用java内置的安全机制,保证下载执行程序时用户系统的安全。
4.便于编写和使用:RMI使得java远程服务程序和访问这些服务程序的java客户端程序的编写变得轻松简单。用户可以避免使用socket这样底层的API,编写应用程序时无需设计应用层的消息协议。而且RMI可以使用HTTP进行通信,从而能跨越代理服务器和防火墙。
5.编写一次,到处运行:任何基于RMI的系统可以100%移植到任何java虚拟机上。
6.分布式垃圾收集:RMI采用其分布式垃圾收集功能收集不再被网络中任何客户程序所引用的远程服务对象。
7.并行计算:RMI采用多线程的处理方法。
在RMI中,调用远程对象的对象称为客户端对象,而远程对象被称为服务器对象。为了实现位置透明性,RMI引入了两种特殊类型的对象——存根(Stub)和框架(Skeleton)。RMI的体系结构如下图:
下面来看看程序的具体实现(源码请看最后):
首先是公共接口的定义:ChatServer和Chatter,不论服务器端或者是客户端都要用到这两个接口。
接下来设计服务器端程序模块:
先实现ChatServer接口,创建类ChatServerImpl。
再来定义一个UserInfo类来存储用户名和远程客户端对象之间的对应。
对服务端的界面加以设计,效果如图(图标有点大,不过不要在意这些细节emmm)。
下面进行客户端的设计:
先对接口进行实现,创建类ChatterImpl。
页面设计效果如下。
点击文件,输入ip进行连接,这里使用本地的连接进行测试。
启动服务器。
输入ip进行连接。
这边开了两个客户端进行测试,效果如下。
再开启一个客户端,进行私聊测试,只有选择的对象接收到了消息,很成功!