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

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

使用UDP Sockets技術(shù)完成IP多點(diǎn)傳送2(轉(zhuǎn)中華技術(shù)網(wǎng))

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

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

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

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

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

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


主站蜘蛛池模板: 天天久久狠狠色综合 | 日韩黄色一级毛片 | 中文字幕亚洲日本岛国片 | 在线观看91香蕉国产免费 | 一二三四在线观看免费高清网 | 天天干天天操天天做 | 色婷婷5月精品久久久久 | 先锋资源中文 | 一级片一级毛片 | 亚洲精品九色在线网站 | 视频在线色 | 中文字幕福利 | 日韩一级黄色片 | 四虎免费在线播放 | 亚洲成a v人片在线看片 | 青青草原亚洲视频 | 午夜影院在线免费 | 欧美午夜视频 | 婷婷97狠狠的狠狠的爱 | 亚洲国内精品久久 | 日韩成人毛片高清视频免费看 | 日韩第一页在线 | 亚洲成a人片在线观看88 | 伊伊人成亚洲综合人网香 | 日本精品欧洲www | 天天操天天曰 | 亚洲成在人线av | 日产乱码卡一卡2卡三卡四福利 | 欧美一区二区三区在线观看 | 欧美一级一级做性视频 | 天天久久综合网站 | 日韩邪恶 | 午夜久久免费视频 | 亚洲欧美在线视频观看 | 青青热久久国产久精品 | 欧美又大粗又爽又黄大片视频黑人 | 青青青青青青青青草 | 四虎影院最新网址 | 亚洲色图小说 | 天堂8在线官网 | 青青青手机视频在线观看 |