下面将结合MulticastSocket和DatagramSocket开发一个简单的局域网内的即时通信工具局域网内每个用户启动该工具后就可以看到该局域网内所有在线用户他也会被其他用户看到即看到如图所示的窗口
在图的用户列表中双击任意一个用户即可启动一个如图所示的交谈窗口
图 局域网聊天工具
图 与特定用户交谈
如果双击图所示用户列表窗口中所有人列表项即可启动一个与图相似的交谈窗口不同的是通过该窗口发送的消息将会被所有人看到
该程序的实现思路是每个用户都启动个Socket一个MulticastSocket一个DatagramSocket
其中MulticastSocket会周期性地向发送在线信息且所有用户的MulticastSocket都会加入到这个多点广播IP中这样每个用户都可以收到其他用户广播的在线信息如果系统经过一段时间没有收到某个用户广播的在线信息则从用户列表中删除该用户除此之外该MulticastSocket还用于向所有用户发送广播信息
DatagramSocket主要用于发送私聊信息当用户收到其他用户广播来的DatagramPacket时即可获取该用户MulticastSocket对应的SocketAddress这个SocketAddress将作为发送私聊信息的重要依据本程序让MulticastSocket在端口监听而DatagramSocket在端口监听这样程序就可以根据其他用户广播来的DatagramPacket得到他的DatagramSocket所在的地址
本系统提供了一个UserInfo类该类封装了用户名图标对应的SocketAddress以及该用户对应的交谈窗口失去联系的次数等信息该类的代码片段如下
程序清单codes///LanTalk/UserInfojava
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)
{
thisicon = icon;
thisname = name;
thisaddress = address;
thislost = lost;
}
//此处省略了该类所有属性的setter和getter方法
…
//使用address作为该用户的标识所以根据address作为
//重写hashCode()和equals方法的标准
public int hashCode()
{
return addresshashCode()
}
public boolean equals(Object obj)
{
if (obj != null && objgetClass()==UserInfoclass)
{
return ((UserInfo)obj)getAddress()equals(address)
}
return false;
}
}
返回目录疯狂Java讲义
编辑推荐
Java程序性能优化让你的Java程序更快更稳定
新手学Java 编程
Java程序设计培训视频教程