麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

對(duì)等計(jì)算實(shí)踐:基于 IP 多播的發(fā)現(xiàn)

2019-11-18 13:26:29
字體:
供稿:網(wǎng)友

  要完成有用的工作,P2P 應(yīng)用程序中的對(duì)等點(diǎn)必須能夠彼此發(fā)現(xiàn)對(duì)方并與對(duì)方交互。在上一篇文章中,Todd 描述了幾種不同的機(jī)制,對(duì)等點(diǎn)可以使用這些機(jī)制彼此發(fā)現(xiàn),他還解釋了每種機(jī)制的優(yōu)缺點(diǎn)。本月,他提供了一種基于 ip 多播的發(fā)現(xiàn)的實(shí)現(xiàn)。
  在軟件實(shí)體能夠參與具有 P2P 應(yīng)用程序特征的直接的對(duì)等交互之前,該實(shí)體必須發(fā)現(xiàn)將要與之交互的適當(dāng)?shù)膶?duì)等點(diǎn)。所有可行的 P2P 體系結(jié)構(gòu)都提供一種針對(duì)發(fā)現(xiàn)問題的解決方案。上一次,我們研究了實(shí)現(xiàn)發(fā)現(xiàn)的幾種不同的方法。本月,我將描述其中一種機(jī)制的實(shí)現(xiàn)。讓我們通過回顧來開始今天的討論。
  
  再訪發(fā)現(xiàn)
  對(duì)等點(diǎn)發(fā)現(xiàn)使 P2P 應(yīng)用程序中的對(duì)等點(diǎn)能夠彼此定位以便相互之間可以交互。實(shí)現(xiàn)對(duì)等點(diǎn)發(fā)現(xiàn)服務(wù)有多種方法。最簡(jiǎn)單的機(jī)制是顯式點(diǎn)到點(diǎn)配置。這種機(jī)制通過要求每個(gè)對(duì)等點(diǎn)知道所有它可能與之交互的其它對(duì)等點(diǎn),并與它們相連,來進(jìn)行工作。點(diǎn)到點(diǎn)配置的主要優(yōu)點(diǎn)是簡(jiǎn)單。它的主要缺點(diǎn)是缺乏靈活性并且缺少擴(kuò)展到對(duì)等點(diǎn)的大型網(wǎng)絡(luò)的能力。
  
  發(fā)現(xiàn)的另一個(gè)公共模型是使用中心目錄作為中介。該模型在許多傳統(tǒng)的、非 P2P 分布式類型的應(yīng)用程序中間很流行,其優(yōu)點(diǎn)是很好理解。對(duì)等點(diǎn)向中心目錄注冊(cè)自己的存在,并使用中心目錄定位其它對(duì)等點(diǎn)。這種模型的主要優(yōu)點(diǎn)是易于治理和擴(kuò)展的能力。但是,其集中化設(shè)計(jì)會(huì)導(dǎo)致單點(diǎn)故障,因此它對(duì)自然力或網(wǎng)上沖浪人數(shù)增加所帶來的危害缺乏抵御能力。
  
  許多流行的 P2P 應(yīng)用程序使用網(wǎng)絡(luò)模型而不是中心目錄,在網(wǎng)絡(luò)模型中,單個(gè)對(duì)等點(diǎn)只知道局域網(wǎng)絡(luò)上的對(duì)等點(diǎn)身份。每個(gè)對(duì)等點(diǎn)都作為那些與之相連的對(duì)等點(diǎn)的目錄。對(duì)等點(diǎn)通過向相鄰對(duì)等點(diǎn)傳播目錄查詢并返回相關(guān)的響應(yīng)來進(jìn)行合作。這種模型的主要優(yōu)點(diǎn)是沒有集中化。它的主要缺點(diǎn)是由于傳播查詢耗費(fèi)了大量的網(wǎng)絡(luò)和處理能力。
  
  上面三種機(jī)制有無數(shù)種變體。不討論這些變體了,讓我們繼續(xù)前進(jìn)并研究另一種發(fā)現(xiàn)機(jī)制。
  
  IP 多播發(fā)現(xiàn)
  就每個(gè)對(duì)等點(diǎn)維護(hù)自己的目錄這點(diǎn)而言,多播模型類似于網(wǎng)絡(luò)模型。但是,對(duì)等點(diǎn)不通過合作來實(shí)現(xiàn)大規(guī)模網(wǎng)絡(luò)查詢。另外,對(duì)等點(diǎn)利用網(wǎng)絡(luò)本身提供的特性(IP 多播)來定位和標(biāo)識(shí)其它對(duì)等點(diǎn)。
  
  IP 多播是無連接和不可靠的(不象 TCP/IP 是面向連接和可靠的)。雖然它使用 IP 數(shù)據(jù)報(bào);但是不象單播 IP 數(shù)據(jù)報(bào)那樣是從一臺(tái)主機(jī)發(fā)送到另一臺(tái)主機(jī),多播 IP 數(shù)據(jù)報(bào)可以同時(shí)發(fā)往多臺(tái)主機(jī)。
  
  對(duì)等點(diǎn)定期使用 IP 多播來公布自己的存在。公布包含了它們的主機(jī)名和一個(gè)用于正常通信的端口。對(duì)此消息感愛好的對(duì)等點(diǎn)檢測(cè)這個(gè)消息后,抽取出主機(jī)名和端口號(hào),并使用該消息建立一個(gè)通信通道。
  
  回顧已經(jīng)足夠了。讓我們開始研究代碼吧。
  
  簡(jiǎn)單的客戶機(jī)與服務(wù)器
  我們將從一個(gè)簡(jiǎn)單的示例開始,該示例演示了兩個(gè)進(jìn)程如何使用 IP 多播進(jìn)行通信。為了簡(jiǎn)化演示,我將分別從客戶機(jī)和服務(wù)器進(jìn)程這兩個(gè)方面來介紹示例。P2P 應(yīng)用程序通常會(huì)實(shí)現(xiàn)這兩個(gè)進(jìn)程,將它們劃分為客戶機(jī)或服務(wù)器并不輕易。
  
  在本例中,服務(wù)器進(jìn)程進(jìn)行循環(huán)并等待數(shù)據(jù)報(bào)包的到來。每接收到一個(gè)包,服務(wù)器就會(huì)向控制臺(tái)打印一條簡(jiǎn)短的診斷消息。客戶機(jī)角色要簡(jiǎn)單得多 — 它多播單個(gè)數(shù)據(jù)報(bào)包并退出。
  
  清單 1 和 2 說明了這兩部分是如何組合在一起的。代碼中的注釋說明了正在發(fā)生的事情。
  
  清單 1. 簡(jiǎn)單服務(wù)器
  public
  class Server
  {
  public
  static
  void
  main(String [] arstring)
  {
  try
  {
  // Create a multicast datagram socket for receiving IP
  // multicast packets. Join the multicast group at
  // 230.0.0.1, port 7777.
  MulticastSocket multicastSocket = new MulticastSocket(7777);
  InetAddress inetAddress = InetAddress.getByName("230.0.0.1");
  multicastSocket.joinGroup(inetAddress);
  // Loop forever and receive messages from clients. PRint
  // the received messages.
  while (true)
  {
  byte [] arb = new byte [100];
  DatagramPacket datagramPacket = new DatagramPacket(arb, arb.length);
  multicastSocket.receive(datagramPacket);
  System.out.println(new String(arb));
  }
  }
  catch (Exception exception)
  {
  exception.printStackTrace();
  }
  }
  }
  
  
  
  
  清單 2. 簡(jiǎn)單客戶機(jī)
  public
  class Client
  {
  public
  static
  void
  main(String [] arstring)
  {
  try
  {
  // Create a datagram package and send it to the multicast
  // group at 230.0.0.1, port 7777.
  byte [] arb = new byte [] {'h','e','l','l','o'};
  InetAddress inetAddress = InetAddress.getByName("230.0.0.1");
  DatagramPacket datagramPacket =
  new DatagramPacket(arb, arb.length, inetAddress, 7777);
  MulticastSocket multicastSocket = new MulticastSocket();
  multicastSocket.send(datagramPacket);
  }
  catch (Exception exception)
  {
  exception.printStackTrace();
  }
  }
  }
  
  
  
  
  java.net 包中的兩個(gè)類使它運(yùn)行。java.net.DatagramPacket 類保存了 IP 數(shù)據(jù)報(bào)包中包含的數(shù)據(jù)。java.net.MulticastSocket 類創(chuàng)建一個(gè)調(diào)整到一個(gè)特定多播組的多播套接字。
  
  發(fā)現(xiàn)組件
  盡管上述示例是一個(gè)很好的 IP 多播的演示,但它沒有說明實(shí)現(xiàn)基于 IP 多播的對(duì)等點(diǎn)發(fā)現(xiàn)需要什么。要使它有用,我們需要一個(gè)功能不僅限于發(fā)送和接收包的軟件組件。理想情況下,這個(gè)組件將了解它所接收的包的源對(duì)等點(diǎn),并適當(dāng)?shù)貋G棄一些信息,這些信息是關(guān)于那些它認(rèn)為已經(jīng)消失、死亡或以其它方式離去的對(duì)等點(diǎn)的。
  
  在這個(gè)新設(shè)計(jì)中,對(duì)等點(diǎn)是一個(gè)多播組的成員。請(qǐng)牢記,發(fā)送到多播組的消息會(huì)透明地路由到該組的所有成員。
  
  設(shè)計(jì)包括兩個(gè)核心類和三個(gè)接口(我使用術(shù)語“接口”似乎不太嚴(yán)謹(jǐn) — 在技術(shù)上是一個(gè)接口和兩個(gè)抽象類)。Member 類的實(shí)例是一個(gè)多播組的成員。這個(gè)類治理所有的通信細(xì)節(jié)。MemberManager 類的一個(gè)實(shí)例負(fù)責(zé)了解參與多播組的其它成員。
  
  對(duì)等點(diǎn)通過向多播組發(fā)送一個(gè)消息,來向?qū)儆诙嗖ソM中的對(duì)等點(diǎn)公布自己的存在。每個(gè)消息包含關(guān)于發(fā)送消息的對(duì)等點(diǎn)的信息 — 通常是主機(jī)名和用于正常(與發(fā)現(xiàn)無關(guān))通信的端口。Member 類和 MemberManager 類對(duì)這些消息的內(nèi)容幾乎一無所知。對(duì)該信息的訪問權(quán)屬于使用這兩個(gè)類的應(yīng)用程序。
  
  有三個(gè)接口跨越了消息傳遞/發(fā)現(xiàn)層和使用它的應(yīng)用程序?qū)又g的邊界。它們是 Reference 抽象類、Message 接口和 MessageFactory 抽象類。應(yīng)用程序必須提供這三個(gè)接口的實(shí)現(xiàn)。
  
  Reference 抽象類定義了對(duì)多播組成員的引用。MemberManager 類治理一個(gè)引用集。應(yīng)用程序?qū)?shí)現(xiàn)這個(gè)類的一個(gè)具體版本,它將包含應(yīng)用程序所需要的任何引用邏輯。該類定義了兩個(gè)方法,名稱是 equalsInternal() 和 hashCodeInternal(),并且重新定義了 equals() 和 hashCode() 方法來調(diào)用這些方法。它通過這樣做來強(qiáng)制實(shí)現(xiàn)者為這兩個(gè)要害功能提供實(shí)現(xiàn) — MemberManager 依靠于它們。
  
  Message 接口定義了通過網(wǎng)絡(luò)代碼交換的消息數(shù)據(jù)的應(yīng)用程序視圖。應(yīng)用程序?qū)⒃撓⒖醋魇窍鄬?duì)于應(yīng)用程序運(yùn)行范圍的高級(jí)概念 — 類似于主機(jī)名和端口的概念。網(wǎng)絡(luò)代碼希望發(fā)送一個(gè)由字節(jié)組成的包。Message 接口的實(shí)現(xiàn)定義了如何將這些高級(jí)信息與字節(jié)相互轉(zhuǎn)換。引用是信息的一個(gè)要害部分,所有消息都必須包含,因此該接口要求實(shí)現(xiàn)提供用于讀和寫 reference 的方法。
  
  問題的最后部分是 MessageFactory 抽象類。這個(gè)類定義了生成新的 Message 實(shí)例的機(jī)制。深藏在 Member 類內(nèi)的網(wǎng)絡(luò)代碼使用一個(gè)工廠來創(chuàng)建從多播數(shù)據(jù)報(bào)中抽取出的數(shù)據(jù)的 Message 實(shí)例。每個(gè) MessageFactory 實(shí)例擁有一個(gè)隨機(jī)生成的身份,它使用這個(gè)身份來從接收的消息中濾出要發(fā)送的消息。
  
  總之,這五個(gè)類和接口(Member、MemberManager、Reference、Message 和 MessageFactory)構(gòu)成了一個(gè)用于進(jìn)行對(duì)等點(diǎn)發(fā)現(xiàn)的簡(jiǎn)單框架。當(dāng)然,還有可以改進(jìn)的空間。可以很輕易地添加一種基于事件的機(jī)制,用于向感愛好的偵聽器通知成員的出現(xiàn)或消失。一種用于過濾所接收消息的靈活機(jī)制將很有用,但其實(shí)現(xiàn)卻比較困難。我將這些建議留作讀者的作業(yè)。
  
  Member 類
  上面描述的框架的完整源代碼太長(zhǎng)了,這里就不具體展示了,所以讓我們只研究 Member 類的部分代碼,因?yàn)槠渲邪瞬僮鞯拇蠖鄶?shù)內(nèi)容。更準(zhǔn)確地說,操作發(fā)生在兩個(gè)內(nèi)部類中:MemberClient 類和 MemberServer 類。
  
  請(qǐng)?jiān)俅慰紤]第一個(gè)示例。它由一個(gè)發(fā)送 IP 多播數(shù)據(jù)報(bào)的客戶機(jī)和一個(gè)接收數(shù)據(jù)報(bào)的服務(wù)器組成。在本例中(清單 3 和 4),兩個(gè)單獨(dú)的應(yīng)用程序執(zhí)行這兩項(xiàng)功能。P2P 應(yīng)用程序中的對(duì)等點(diǎn)的行為方式既象客戶機(jī)又象服務(wù)器,所以我們的 P2P 應(yīng)用程序應(yīng)該同時(shí)包含兩者才是適合的。
  
  清單 3. MemberClient 類
  private
  class MemberClient
  extends Thread
  {
  public
  void
  run()
  {
  try
  {
  while (true)
  {
  try
  {
  Message message = m_messagefactory.createSendMessage();
  Reference reference = message.createReferen

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 成人毛片免费视频 | 亚洲午夜不卡 | 九色一区二区 | 亚洲人成在线播放 | 欧美成人免费电影 | 一级免费视频 | videos高潮| 久久久www成人免费精品 | 欧美综合在线观看 | 神马顶级推理片免费看 | 午夜精品成人一区二区 | 国产精品99一区二区 | 亚洲精品午夜国产va久久成人 | 中文字幕在线观看视频一区 | 一道本不卡一区 | 精品亚洲va在线va天堂资源站 | 少妇一级淫片免费放播放 | 九九热视频这里只有精品 | 全免费午夜一级毛片真人 | 亚洲性在线视频 | www.91成人 | 久久成年网 | 久久成人视屏 | 免费一级高清毛片 | 免费在线成人网 | 叉逼视频 | 精品国产一区二区三区四区在线 | 国产在线看一区 | 成人在线精品视频 | 亚洲三区精品 | 欧美亚洲另类在线 | 免费高清一级欧美片在线观看 | 成人羞羞在线观看网站 | 九色在线78m | 午色影院 | 免看黄大片aa | 永久免费黄色大片 | 成人男女免费视频 | 久久综合av| 欧美日本免费一区二区三区 | 91久久久久久亚洲精品禁果 |