標籤:
上面程式中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;
- }
- }
17.4.3 使用MulticastSocket實現多點廣播(3)