快精灵印艺坊 您身边的文印专家
广州名片 深圳名片 会员卡 贵宾卡 印刷 设计教程
产品展示 在线订购 会员中心 产品模板 设计指南 在线编辑
 首页 名片设计   CorelDRAW   Illustrator   AuotoCAD   Painter   其他软件   Photoshop   Fireworks   Flash  

 » 彩色名片
 » PVC卡
 » 彩色磁性卡
 » 彩页/画册
 » 个性印务
 » 彩色不干胶
 » 明信片
   » 明信片
   » 彩色书签
   » 门挂
 » 其他产品与服务
   » 创业锦囊
   » 办公用品
     » 信封、信纸
     » 便签纸、斜面纸砖
     » 无碳复印纸
   » 海报
   » 大篇幅印刷
     » KT板
     » 海报
     » 横幅

利用UDP Sockets技术实现IP多点传送2(转中华技术网)

DatagramPacket类
  我们可以使用DatagramPacket类创建一个用于发送的数据报,而当接收UDP数据报时,可以使用DatagramPacket类读取数据报中的数据,发送者及其它信息。
  为了创建一个数据报并发送到远地系统,可以使用下面的构造器:
  Public DatagramPacket(byte ibuf,int length,InetAddress iaddr,int iport,);
  ibuf是编码信息数据的字节数组,它的长度length就是数据报放在其中的字节数组的长度,iaddr是一个InetAddress对象,存储着接收方的主机名和IP地址等信息,iport标识数据报发送到接收主机的端口。
  为了接收数据报,必须使用DatagramPacket构造器,其原型为:public DatagramPacket(byte ibuf,int ilength);ibuf是指接收的数据报的数据部分, ilength是该部分数据的长度。假如 ilength 小于机器接收的UDP数据报的尺寸,多余的字节将被Java忽略。
  另外,类中有一些方式(method)可以让我们得到一些相关的信息:
  public int getLength(); //得到数据报中数据块的字节尺寸
  public bytegetData();//得到接收数据报中的数据
  public InetAddress getAddress(); //为发送者提供一个 InetAddress对象
  public int getPort(); //得到UDP端口
  值得注重的是,TCP sockets的编程中,我们无须将传送的数据分块,然而,当我们创建一个基于UDP的网络通讯应用程序时,必须创建一套方式,在运行时刻决定需分割的数据报的长度。对于TCP/IP,最大的数据报可以含有65507字节的数据,然而,主机仅能接收最多548字节的数据,支持8192字节的大数据报的平台是利用IP层对数据报进行分割的。假如在传送期间,任何含有IP报文的一个数据块丢失,都会造成整个UDP数据报的丢失,因此,我们在确定应用中数据报尺寸时,对其尺寸的合理性一定要谨慎。
  下面就是分割数据的一个例子:
  //循环地从输入流input中读一行数据
  while((nextLine=input.readLine())!=null){
  //定义一个空数据报,其尺寸为512
  mcastBuffer=new byte[512];
  //假如读入的数据的长度大于定义的数据报的长度,
  //则使用定义的长度,否则使用读入数据的长度
  if(nextLine.length()>mcastBuffer.length){
  sendLength=mcastBuffer.length;
  }else {
  sendLenth=nextLine.length();
  }
  //将读入的数据转变为byte类型
  lineData=nextLine.getBytes();
  //将数据复制到用于创建数据报的byte数组
  for(int i=0;i<sendLength;i++){
  mcastBuffer[i]=lineData[i];
  }
  ……创建数据报,发送或接收……
  }

MulticastSocket类
  Java的 MulticastSocket类是实施IP多点传送网络特征的要害,它答应我们使用多点传送IP发送或接收UDP数据报。 MulticastSocket的构造器为:
  public MulticastSocket () throws IOException;  //创建一个多点传送socket
  public MulticastSocket(int port)throws IOException;//在指定端口创建一个多点传送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{} //发送数据报
  public synchronized void receive(DatagramPacket p,byte ttl) throws IOException{}  //接收数据报
  创建一个DatagramPacket对象之后,我们必须相应地创建一个 MulticastSocket对象,这样,数据报就可以使用send()方式发送了。下面的代码演示了如何创建 MulticastSocket、发送和接收IP多点传送数据报:
  int multiPort=2345; //定义端口号,非超级用户应使用1024以上的端口
  int ttl=1; //设定TTL值
  InetAddress multiAddr=InetAddress.getByName(″224.0.1.100″); //设定多点传送IP
  byteSmultiBytes={\\\'H\\\',\\\'e\\\',\\\'1\\\',\\\'1\\\',\\\'O\\\'}; //定义一个内容为“Hello”的数据报
  //创建多点传送数据报
  DatagramPacket SmultiDatagram new Datagram Packet(SmultiBytes,SmultiBytes,length,multiAddr,multiPort);
  MulticastSocket multiSocket=new MulticastSocket();  //创建多点传送socket
  multiSocket.send(SmultiDatagram,ttl); //发送数据报(不加入到组中)
  ……
  byteRmultiBytes=new byte[256]; //定义一个空数据报,长度为256字节
  //创建接收数据报
  DatagramPacket RmultiDatagram=new DatagramPacket(RmultiBytes,RmultiBytes.length);
  multiSocket.joinGroup(multiAddr); //加入到多点传送组中
  multiSocket.receive(RmultiDatagram);//接收UDP数据报

  ……
  multiSocket.leaveGroup(multiAddr); //离开多点传送组
  multiSocket.close();  //关闭多点传送 socket
  当调用joinGroup()方式时,机器将关注沿着网络传送属于特定多点传送组的任何IP报文,也就是说,机器拥有了一个邮箱。主机还应使用IGMP相应地报告组的使用。对于多IP地址的机器,应配置数据报发送的接口:setInterface(oneOfMyLocalAddrs);
  在DatagramSocket中没有类似 setSo Timeout()的方式设置超时。

IP多点传送应用程序的开发流程
  由于IP多点传送主要用于同组中成员的交流,因此,应用程序的开发流程大体如下:
  1.创建一个需发送的按规定编址的数据报DatagramPacket;
  2.建立一个用于发送和接收的MulticastSocket;
  3.加入一个多点传送组;
  4.将数据报放入MulticastSocket中传送出去;
  5.等待从MulticastSocket接收数据报;
  6.解码数据报提取信息;
  7.根据得到的信息作出回应;
  8.重复5―7步;
  9.离开该多点传送组,关闭MulticastSocket。

结束语
  在实际应用中,发送和接收数据建议分别以单独的线程同时运行,另外,假如需在屏幕上显示,建议使用两个线程在两个不同的窗口分别负责显示发送的数据和接收的数据。□

作者单位:建设银行云南保山地区分行 (云南保山678000) 



返回类别: 教程
上一教程: Java 在Client/Server 网络中的应用 (转)
下一教程: 在Java程序中运行外部类文件

您可以阅读与"利用UDP Sockets技术实现IP多点传送2(转中华技术网)"相关的教程:
· 利用UDP Sockets技术实现IP多点传送1(转中华技术网)
· 利用UDP SOCKETS技术实现IP多点传送
· 使用J2ME技术实现简朴的动画(附代码实现)
· 利用Java实现zip压缩/解压缩
· 利用JAVA实现ZIP压缩/解压缩
    微笑服务 优质保证 索取样品