六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

使用UDP Sockets技術(shù)完成IP多點傳送

[摘要]楊紹方 摘 要 本文介紹了UDP Sockets的基本概念和IP多點傳送的原理,詳細討論了Java中的相關(guān)類及使用方法,提供了一個IP多點傳送的開發(fā)流程。 關(guān)鍵詞 Java UDP Sockets ...
楊紹方

摘 要 本文介紹了UDP Sockets的基本概念和IP多點傳送的原理,詳細討論了Java中的相關(guān)類及使用方法,提供了一個IP多點傳送的開發(fā)流程。
關(guān)鍵詞 Java UDP Sockets 

  IP 多點傳送 MulticastSocket 類IP多點傳送(multicast delivery)是針對點到點的傳送和廣播傳送兩種方式而言的,它是指在一定的組內(nèi)對其成員進行的廣播,是一種有限的廣播。組中的某個成員發(fā)出的信息,組中的其它所有成員都能收到。它是UDP Sockets的一個分支。
  IP多點傳送特別適合與高帶寬的應(yīng)用,例如在網(wǎng)絡(luò)上發(fā)送視頻和音頻。隨著網(wǎng)絡(luò)帶寬的不斷提高和網(wǎng)絡(luò)通訊質(zhì)量的不斷改善,IP多點傳送還將廣泛地被應(yīng)用于網(wǎng)上聊天及網(wǎng)上會議,分布式數(shù)據(jù)存儲,聯(lián)機事務(wù)處理,交互式游戲等方面。另外,多點傳送還可以被客戶機用于在網(wǎng)絡(luò)上尋找相應(yīng)的服務(wù)器,客戶機發(fā)送一個多點傳送的請求,任何監(jiān)聽服務(wù)器都可以與客戶機連接并開始一個事務(wù)。

UDP Socket基礎(chǔ)
  使用用戶數(shù)據(jù)報協(xié)議(User Datagram Protocol,簡稱UDP)進行會話必須將信息裝配成一定尺寸的小報文,當發(fā)送一條信息,接收方能否收到并返回信息永遠是不確定的,如果無法收到返回信息,我們就無法確定我們發(fā)送的信息是否被接收——它可能在途中丟失,接收者返回的響應(yīng)信息也可能丟失,另外,接收者也可能忽略我們的信息,因此,UDP被描述為不可靠的、無連接的和面向消息的。
  創(chuàng)建UDP sockets非常象創(chuàng)建一個郵箱。郵箱是使用地址來識別的,但是,我們不需要為每個發(fā)送信息的人構(gòu)造一個新的郵箱,可以在含有發(fā)送信息的明信片上寫上目的地址,將其放在郵箱中并發(fā)送出去。接收者可能會長久的等待,直到含有信息的明信片到達它的郵箱,而明信片上標識了發(fā)送者的返回地址。

IP多點傳送的原理
  為了支持IP多點傳送,某些范圍的IP地址被單獨留出專門用于這個目的,這些IP地址是D類地址,其地址的最高四比特的位模式為“1110”,即IP地址的范圍在224.0.0.0和239.255.255.255之間。它們中的每一個IP地址都可以被引用作為一個多點傳送組,任何以該IP地址編址的IP報文將被該組中的其它所有機器接收,也就是說,一個IP地址就相當于一個郵箱。另外,組中的成員是動態(tài)的并隨時間而改變。
  對于IP多點傳送,網(wǎng)間網(wǎng)組管理協(xié)議(Internet Group Management Protocol,簡稱IGMP),用于管理多點傳送組中的成員。支持多點傳送的路由可以使用IGMP決定本地的機器是否贊成加入某個組,一個多點傳送路由可以決定是否轉(zhuǎn)發(fā)一個多點傳送報文。
  影響多點傳送報文的一個重要參數(shù)是time-to-live(TTL)。TTL用于描述發(fā)送者希望傳送的信息能通過多少不同的網(wǎng)絡(luò)。當報文被路由器轉(zhuǎn)發(fā),報文中的TTL將減一,當TTL為零時,報文將不再向前發(fā)送。
  在實際使用中,我們必須注意下面幾點:
  1.這些IP地址只能作為信宿地址使用,絕對不能出現(xiàn)在任何信源地址域中,也不能出現(xiàn)在源路徑或記錄路徑選項中:
  2.由于IP多點傳送是一對多的傳送,因此,不能利用差錯與控制報文協(xié)議(Internet Control Message Protocol,簡稱ICMP)產(chǎn)生出錯報文。
  3.發(fā)送一個信息到一個組,發(fā)送主機可以不是組中的成員;
  4.一些組被Internet Assigned Numbers Authority(IANA)分配,保留用于特殊的目的,詳情參見:ftp://ftp.internic.net/rfc/rfc1700.txt。另外,避免使用一些保留組,從224.0.0.0到224.0.0.225僅限于本地子網(wǎng)使用。建議在224.0.1.27和224.0.1.225之間任意選取一個IP地址。
  5.如果我們選取的組已經(jīng)被使用,與其他機器的通訊將會混亂,一旦發(fā)生,可以退出應(yīng)用,試試其他的地址。
  6.當一個機器加入一個多點傳送組,它將開始接收該IP多點傳送地址的信息。如果多點傳送報文分發(fā)到網(wǎng)絡(luò)上,任何監(jiān)聽該信息的機器都會有機會接收它。對于IP多點傳送,沒有一個機制對相同網(wǎng)絡(luò)上的機器能否加入該多點傳送組加以限制。因此,安全性是我們必須考慮的問題之一。
  7.選擇的TTL參數(shù)應(yīng)盡可能小。一個大的TTL值會不必要地占用Internet帶寬。此外,還可能破壞不同區(qū)域使用相同組的其它的多點傳送通訊。

Java中與IP多點傳送相關(guān)的類
  java.net包中含有UDP通訊所需要的工具,其中包括IP多點傳送。

DatagramPacket類
  我們可以使用DatagramPacket類創(chuàng)建一個用于發(fā)送的數(shù)據(jù)報,而當接收UDP數(shù)據(jù)報時,可以使用DatagramPacket類讀取數(shù)據(jù)報中的數(shù)據(jù),發(fā)送者及其它信息。
  為了創(chuàng)建一個數(shù)據(jù)報并發(fā)送到遠地系統(tǒng),可以使用下面的構(gòu)造器:
  Public DatagramPacket(byte ibuf,int length,InetAddress iaddr,int iport,);
  ibuf是編碼信息數(shù)據(jù)的字節(jié)數(shù)組,它的長度length就是數(shù)據(jù)報放在其中的字節(jié)數(shù)組的長度,iaddr是一個InetAddress對象,存儲著接收方的主機名和IP地址等信息,iport標識數(shù)據(jù)報發(fā)送到接收主機的端口。
  為了接收數(shù)據(jù)報,必須使用DatagramPacket構(gòu)造器,其原型為:public DatagramPacket(byte ibuf,int ilength);ibuf是指接收的數(shù)據(jù)報的數(shù)據(jù)部分, ilength是該部分數(shù)據(jù)的長度。如果 ilength 小于機器接收的UDP數(shù)據(jù)報的尺寸,多余的字節(jié)將被Java忽略。
  另外,類中有一些方法(method)可以讓我們得到一些相關(guān)的信息:
  public int getLength(); //得到數(shù)據(jù)報中數(shù)據(jù)塊的字節(jié)尺寸
  public bytegetData();//得到接收數(shù)據(jù)報中的數(shù)據(jù)
  public InetAddress getAddress(); //為發(fā)送者提供一個 InetAddress對象
  public int getPort(); //得到UDP端口
  值得注意的是,TCP sockets的編程中,我們無須將傳送的數(shù)據(jù)分塊,然而,當我們創(chuàng)建一個基于UDP的網(wǎng)絡(luò)通訊應(yīng)用程序時,必須創(chuàng)建一套方法,在運行時刻決定需分割的數(shù)據(jù)報的長度。對于TCP/IP,最大的數(shù)據(jù)報可以含有65507字節(jié)的數(shù)據(jù),然而,主機僅能接收最多548字節(jié)的數(shù)據(jù),支持8192字節(jié)的大數(shù)據(jù)報的平臺是利用IP層對數(shù)據(jù)報進行分割的。如果在傳送期間,任何含有IP報文的一個數(shù)據(jù)塊丟失,都會造成整個UDP數(shù)據(jù)報的丟失,因此,我們在確定應(yīng)用中數(shù)據(jù)報尺寸時,對其尺寸的合理性一定要謹慎。
  下面就是分割數(shù)據(jù)的一個例子:
  //循環(huán)地從輸入流input中讀一行數(shù)據(jù)
  while((nextLine=input.readLine())!=null){
  //定義一個空數(shù)據(jù)報,其尺寸為512
  mcastBuffer=new byte[512];
  //如果讀入的數(shù)據(jù)的長度大于定義的數(shù)據(jù)報的長度,
  //則使用定義的長度,否則使用讀入數(shù)據(jù)的長度
  if(nextLine.length()>mcastBuffer.length){
  sendLength=mcastBuffer.length;
  }else {
  sendLenth=nextLine.length();
  }
  //將讀入的數(shù)據(jù)轉(zhuǎn)換為byte類型
  lineData=nextLine.getBytes();
  //將數(shù)據(jù)復(fù)制到用于創(chuàng)建數(shù)據(jù)報的byte數(shù)組
  for(int i=0;i   mcastBuffer[i]=lineData[i];
  }
  ……創(chuàng)建數(shù)據(jù)報,發(fā)送或接收……
  }

MulticastSocket類
  Java的 MulticastSocket類是實施IP多點傳送網(wǎng)絡(luò)特征的關(guān)鍵,它允許我們使用多點傳送IP發(fā)送或接收UDP數(shù)據(jù)報。 MulticastSocket的構(gòu)造器為:
  public MulticastSocket () throws IOException;  //創(chuàng)建一個多點傳送socket
  public MulticastSocket(int port)throws IOException;//在指定端口創(chuàng)建一個多點傳送socket
  另外,類中其它常用的方法有:
  public void joinGroup(InetAddress mcastaddr)throws IOException{} //加入多點傳送組
  public void leaveGroup(InetAddress mcastaddr)throws IOException{} //離開多點傳送組
  public synchronized void send(DatagramPacket p,byte ttl) throws IOException{} //發(fā)送數(shù)據(jù)報
  public synchronized void receive(DatagramPacket p,byte ttl) throws IOException{}  //接收數(shù)據(jù)報
  創(chuàng)建一個DatagramPacket對象之后,我們必須相應(yīng)地創(chuàng)建一個 MulticastSocket對象,這樣,數(shù)據(jù)報就可以使用send()方法發(fā)送了。下面的代碼演示了如何創(chuàng)建 MulticastSocket、發(fā)送和接收IP多點傳送數(shù)據(jù)報:
  int multiPort=2345; //定義端口號,非超級用戶應(yīng)使用1024以上的端口
  int ttl=1; //設(shè)定TTL值
  InetAddress multiAddr=InetAddress.getByName(″224.0.1.100″); //設(shè)定多點傳送IP
  byteSmultiBytes={'H','e','1','1','O'}; //定義一個內(nèi)容為“Hello”的數(shù)據(jù)報
  //創(chuàng)建多點傳送數(shù)據(jù)報
  DatagramPacket SmultiDatagram new Datagram Packet(SmultiBytes,SmultiBytes,length,multiAddr,multiPort);
  MulticastSocket multiSocket=new MulticastSocket();  //創(chuàng)建多點傳送socket
  multiSocket.send(SmultiDatagram,ttl); //發(fā)送數(shù)據(jù)報(不加入到組中)
  ……
  byteRmultiBytes=new byte[256]; //定義一個空數(shù)據(jù)報,長度為256字節(jié)
  //創(chuàng)建接收數(shù)據(jù)報
  DatagramPacket RmultiDatagram=new DatagramPacket(RmultiBytes,RmultiBytes.length);
  multiSocket.joinGroup(multiAddr); //加入到多點傳送組中
  multiSocket.receive(RmultiDatagram);//接收UDP數(shù)據(jù)報

  ……
  multiSocket.leaveGroup(multiAddr); //離開多點傳送組
  multiSocket.close();  //關(guān)閉多點傳送 socket
  當調(diào)用joinGroup()方法時,機器將關(guān)注沿著網(wǎng)絡(luò)傳送屬于特定多點傳送組的任何IP報文,也就是說,機器擁有了一個郵箱。主機還應(yīng)使用IGMP相應(yīng)地報告組的使用。對于多IP地址的機器,應(yīng)配置數(shù)據(jù)報發(fā)送的接口:setInterface(oneOfMyLocalAddrs);
  在DatagramSocket中沒有類似 setSo Timeout()的方法設(shè)置超時。

IP多點傳送應(yīng)用程序的開發(fā)流程
  由于IP多點傳送主要用于同組中成員的交流,因此,應(yīng)用程序的開發(fā)流程大體如下:
  1.創(chuàng)建一個需發(fā)送的按規(guī)定編址的數(shù)據(jù)報DatagramPacket;
  2.建立一個用于發(fā)送和接收的MulticastSocket;
  3.加入一個多點傳送組;
  4.將數(shù)據(jù)報放入MulticastSocket中傳送出去;
  5.等待從MulticastSocket接收數(shù)據(jù)報;
  6.解碼數(shù)據(jù)報提取信息;
  7.根據(jù)得到的信息作出回應(yīng);
  8.重復(fù)5—7步;
  9.離開該多點傳送組,關(guān)閉MulticastSocket。

結(jié)束語
  在實際應(yīng)用中,發(fā)送和接收數(shù)據(jù)建議分別以單獨的線程同時運行,另外,如果需在屏幕上顯示,建議使用兩個線程在兩個不同的窗口分別負責顯示發(fā)送的數(shù)據(jù)和接收的數(shù)據(jù)!

作者單位:建設(shè)銀行云南保山地區(qū)分行 (云南保山678000) 


主站蜘蛛池模板: 四虎在线视频免费观看 | 日韩射吧 | 日本v片免费一区二区三区 日本vs欧美一区二区三区 | 性生生活三级视频观看 | 天天干 夜夜操 | 日本天堂影院 | 日韩精品亚洲专区在线观看 | 日韩免费精品一级毛片 | 亚洲a影院| 四虎看黄 | 人人看97 | 一级女人18片毛片免费视频 | 四虎tv | 青青青视频免费 | 色妹子综合 | 色婷婷在线视频观看 | 欧美小视频在线 | 手机午夜视频 | 日本夜夜操 | 亚洲高清视频在线观看 | 天堂网亚洲 | 性国产精品 | 午夜在线观看免费观看大全 | 五月天激情婷婷大综合 | 性荡视频播放器在线视频播放 | 五月激情片 | 日韩精品亚洲精品485页 | 日本韩国理论片大全在线 | 污污免费在线观看 | 亚洲小视频在线观看 | 日韩国产三级 | 色偷偷狠狠色综合网 | 无极色影院| 天天躁日日躁狠狠躁一级毛片 | 三级黄色免费观看 | 青青青青手机在线视频观看国产 | 在线青草 | 天天干免费视频 | 亚洲精品国产福利在线观看 | 婷婷六月久久综合丁香可观看 | 亚洲a毛片 |