17.4.3 使用MulticastSocket实现多点广播(3)
2015-11-15 19:48
302 查看
上面程序中init()方法里的第一行粗体字代码先创建了一个MulticastSocket对象,由于需要使用该对象接收数据报,所以为该Socket对象设置使用固定端口;第二行粗体字代码将该Socket对象添加到指定的多点广播IP地址;第三行粗体字代码设置该Socket发送的数据报会被回送到自身(即该Socket可以接收到自己发送的数据报)。至于程序中使用MulticastSocket发送、接收数据报的代码,与使用DatagramSocket并没有区别,故此处不再赘述。
下面将结合MulticastSocket和DatagramSocket开发一个简单的局域网即时通信工具,局域网内每个用户启动该工具后,就可以看到该局域网内所有的在线用户,该用户也会被其他用户看到,即看到如图17.9所示的窗口。
在图17.9所示的用户列表中双击任意一个用户,即可启动一个如图17.10所示的交谈窗口。
如果双击图17.10所示用户列表窗口中的"所有人"列表项,即可启动一个与图17.10相似的交谈窗口,不同的是通过该窗口发送的消息将会被所有人看到。
该程序的实现思路是,每个用户都启动两个Socket,即一个MulticastSocket,一个DatagramSocket。其中MulticastSocket会周期性地向230.0.0.1发送在线信息,且所有用户的MulticastSocket都会加入到230.0.0.1这个多点广播IP地址中,这样每个用户都可以收到其他用户广播的在线信息,如果系统经过一段时间没有收到某个用户广播的在线信息,则从用户列表中删除该用户。除此之外,该MulticastSocket还用于向所有用户发送广播信息。
DatagramSocket主要用于发送私聊信息,当用户收到其他用户广播来的DatagramPacket时,即可获取该用户MulticastSocket对应的SocketAddress,这个SocketAddress将作为发送私聊信息的重要依据--本程序让MulticastSocket在30000端口监听,而DatagramSocket在30001端口监听,这样程序就可以根据其他用户广播来的DatagramPacket得到他的DatagramSocket所在的地址。
本系统提供了一个UserInfo类,该类封装了用户名、图标、对应的SocketAddress以及该用户对应的交谈窗口、失去联系的次数等信息。该类的代码片段如下。
程序清单:codes\17\17.4\LanTalk\UserInfo.java
public class UserInfo
{
// 该用户的图标
private String icon;
// 该用户的名字
private String name;
// 该用户的MulitcastSocket所在的IP地址和端口
private SocketAddress address;
// 该用户失去联系的次数
private int lost;
// 该用户对应的交谈窗口
private ChatFrame chatFrame;
public UserInfo(){}
// 有参数的构造器
public UserInfo(String icon , String name
, SocketAddress address , int lost)
{
this.icon = icon;
this.name = name;
this.address = address;
this.lost = lost;
}
// 省略所有field的setter和getter方法
...
// 使用address作为该用户的标识,所以根据address
// 重写hashCode()和equals()方法
public int hashCode()
{
return address.hashCode();
}
public boolean equals(Object obj)
{
if (obj != null && obj.getClass() == UserInfo.class)
{
UserInfo target = (UserInfo)obj;
if (address != null)
{
return address.equals(target.getAddress());
}
}
return false;
}
}
下面将结合MulticastSocket和DatagramSocket开发一个简单的局域网即时通信工具,局域网内每个用户启动该工具后,就可以看到该局域网内所有的在线用户,该用户也会被其他用户看到,即看到如图17.9所示的窗口。
在图17.9所示的用户列表中双击任意一个用户,即可启动一个如图17.10所示的交谈窗口。
如果双击图17.10所示用户列表窗口中的"所有人"列表项,即可启动一个与图17.10相似的交谈窗口,不同的是通过该窗口发送的消息将会被所有人看到。
图17.9 局域网聊天工具 |
图17.10 与特定用户交谈 |
DatagramSocket主要用于发送私聊信息,当用户收到其他用户广播来的DatagramPacket时,即可获取该用户MulticastSocket对应的SocketAddress,这个SocketAddress将作为发送私聊信息的重要依据--本程序让MulticastSocket在30000端口监听,而DatagramSocket在30001端口监听,这样程序就可以根据其他用户广播来的DatagramPacket得到他的DatagramSocket所在的地址。
本系统提供了一个UserInfo类,该类封装了用户名、图标、对应的SocketAddress以及该用户对应的交谈窗口、失去联系的次数等信息。该类的代码片段如下。
程序清单:codes\17\17.4\LanTalk\UserInfo.java
public class UserInfo
{
// 该用户的图标
private String icon;
// 该用户的名字
private String name;
// 该用户的MulitcastSocket所在的IP地址和端口
private SocketAddress address;
// 该用户失去联系的次数
private int lost;
// 该用户对应的交谈窗口
private ChatFrame chatFrame;
public UserInfo(){}
// 有参数的构造器
public UserInfo(String icon , String name
, SocketAddress address , int lost)
{
this.icon = icon;
this.name = name;
this.address = address;
this.lost = lost;
}
// 省略所有field的setter和getter方法
...
// 使用address作为该用户的标识,所以根据address
// 重写hashCode()和equals()方法
public int hashCode()
{
return address.hashCode();
}
public boolean equals(Object obj)
{
if (obj != null && obj.getClass() == UserInfo.class)
{
UserInfo target = (UserInfo)obj;
if (address != null)
{
return address.equals(target.getAddress());
}
}
return false;
}
}
相关文章推荐
- UML图之类图和对象图
- 搭建zookeeper集群
- vim在每行行首或行尾添加/删除内容
- statistic learning
- 伪静态
- 第十章
- 一些有用的命令
- Cocos2dx中常用的C++11特性
- 114 linux ubuntu升级桌面图标消失
- python基础知识五
- 调用JSON可能出现异常需要的包
- javascript快速入门第三章jquery基础知识
- centos7安装mysql
- IOS UIActionSheet
- SpringMVC与struts2的区别比较
- Java作业07
- fbmem_init 浅析
- 个人Linux 学习笔记二
- java 自定义Annotation
- LeetCode Two Sum 及C++map浅显理解