下面將結合MulticastSocket和DatagramSocket開發壹個簡單的局域網內的即時通信工具 局域網內每個用戶啟動該工具後 就可以看到該局域網內所有在線用戶 他也會被其他用戶看到 即看到如圖 所示的窗口
在圖 的用戶列表中雙擊任意壹個用戶 即可啟動壹個如圖 所示的交談窗口
圖 局域網聊天工具
圖 與特定用戶交談
如果雙擊圖 所示用戶列表窗口中 所有人 列表項 即可啟動壹個與圖 相似的交談窗口 不同的是通過該窗口發送的消息將會被所有人看到
該程序的實現思路是每個用戶都啟動 個Socket 壹個MulticastSocket 壹個DatagramSocket
其中MulticastSocket會周期性地向 發送在線信息 且所有用戶的MulticastSocket都會加入到 這個多點廣播IP中 這樣每個用戶都可以收到其他用戶廣播的在線信息 如果系統經過壹段時間沒有收到某個用戶廣播的在線信息 則從用戶列表中刪除該用戶 除此之外 該MulticastSocket還用於向所有用戶發送廣播信息
DatagramSocket主要用於發送私聊信息 當用戶收到其他用戶廣播來的DatagramPacket時 即可獲取該用戶MulticastSocket對應的SocketAddress 這個SocketAddress將作為發送私聊信息的重要依據 本程序讓MulticastSocket在 端口監聽 而DatagramSocket在 端口監聽 這樣程序就可以根據其他用戶廣播來的DatagramPacket得到他的DatagramSocket所在的地址
本系統提供了壹個UserInfo類 該類封裝了用戶名 圖標 對應的SocketAddress以及該用戶對應的交談窗口 失去聯系的次數等信息 該類的代碼片段如下
程序清單 codes/ / /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;
}
//此處省略了該類所有屬性的setter和getter方法
…
//使用address作為該用戶的標識 所以根據address作為
//重寫hashCode()和equals方法的標準
public int hashCode()
{
return address hashCode()
}
public boolean equals(Object obj)
{
if (obj != null && obj getClass()==UserInfo class)
{
return ((UserInfo)obj) getAddress() equals(address)
}
return false;
}
}
? 返回目錄 瘋狂Java講義
? 編輯推薦
? Java程序性能優化 讓妳的Java程序更快 更穩定
? 新手學Java 編程
lishixinzhi/Article/program/Java/hx/201311/27257