17.4.3 使用MulticastSocket實現多點廣播(3)

來源:互聯網
上載者:User

標籤:

上面程式中init()方法裡的第一行粗體字代碼先建立了一個MulticastSocket對象,由於需要使用該對象接收資料報,所以為該Socket對象設定使用固定連接埠;第二行粗體字代碼將該Socket對象添加到指定的多點廣播IP地址;第三行粗體字代碼設定該Socket發送的資料報會被回送到自身(即該Socket可以接收到自己發送的資料報)。至於程式中使用MulticastSocket發送、接收資料報的代碼,與使用DatagramSocket並沒有區別,故此處不再贅述。

下面將結合MulticastSocket和DatagramSocket開發一個簡單的區域網路即時通訊工具,區域網路內每個使用者啟動該工具後,就可以看到該區域網路內所有的線上使用者,該使用者也會被其他使用者看到,即看到17.9所示的視窗。

在圖17.9所示的使用者列表中雙擊任意一個使用者,即可啟動一個17.10所示的交談視窗。

如果雙擊圖17.10所示使用者列表視窗中的"所有人"清單項目,即可啟動一個與圖17.10相似的交談視窗,不同的是通過該視窗發送的訊息將會被所有人看到。

圖17.9  區域網路聊天工具
圖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

  1. public class UserInfo
  2. {
  3. // 該使用者的表徵圖
  4. private String icon;
  5. // 該使用者的名字
  6. private String name;
  7. // 該使用者的MulitcastSocket所在的IP地址和連接埠
  8. private SocketAddress address;
  9. // 該使用者失去聯絡的次數
  10. private int lost;
  11. // 該使用者對應的交談視窗
  12. private ChatFrame chatFrame;
  13. public UserInfo(){}
  14. // 有參數的構造器
  15. public UserInfo(String icon , String name
  16. , SocketAddress address , int lost)
  17. {
  18. this.icon = icon;
  19. this.name = name;
  20. this.address = address;
  21. this.lost = lost;
  22. }
  23. // 省略所有field的setter和getter方法
  24. ...
  25. // 使用address作為該使用者的標識,所以根據address
  26. // 重寫hashCode()和equals()方法
  27. public int hashCode()
  28. {
  29. return address.hashCode();
  30. }
  31. public boolean equals(Object obj)
  32. {
  33. if (obj != null && obj.getClass() == UserInfo.class)
  34. {
  35. UserInfo target = (UserInfo)obj;
  36. if (address != null)
  37. {
  38. return address.equals(target.getAddress());
  39. }
  40. }
  41. return false;
  42. }
  43. }

17.4.3 使用MulticastSocket實現多點廣播(3)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.