思诚科技 seecen LOGO
咨询热线:0791-87557233
  首页 |   Java EE  
关于思诚
关注官方微信

利用Java语言实现数据报编程之单播

来源:网络    更新时间:2014-12-3



  实际上,单播就是一个报文从源主机向另一个目标主机发送,接收目标只有一个。

  首先,写收发器类DatagramRecvSender_s,这个类既要发送数据报又要接收数据报,发送一个文件夹中的所有图片,一张一张的进行,接收是在一个线程中进行,每收完一个文件,就激活一个事件,事件处理器处理这个事件。

  类清单为:

packagerecmail.multiservice;

importJava.net.DatagramPacket;
importjava.net.DatagramSocket;
importjava.net.SocketException;
importjava.net.SocketAddress;
importjava.net.UnknownHostException;
importjava.net.InetSocketAddress;
importjava.io.IOException;
importjava.util.ArrayList;
importjava.net.InetAddress;
importjava.io.File;
importjava.util.Iterator;

publicclassDatagramRecvSender_sextendsDataSwapListenerAdapter
implementsRunnable{
 publicstaticfinalintDatagramPort=10698;
 privatejava.net.DatagramSocketroad;
 privateInetAddressia;
 DatagramPacketdp;
 publicstaticfinalintDatagram_Length=8192;
 privateDataPacketcdp;
 privatebooleanishandling=true;

 DataSwapEventdsevent;
 /**
 *这个构造器用于接收数据报.
 */
 publicDatagramRecvSender_s(){
  try{
   System.out.println("recv...");
   ia=InetAddress.getByName("localhost");//192.168.0.17"127.0.0.1"
   dsevent=newDataSwapEvent(this);
   SocketAddresssa=newInetSocketAddress(ia,
   DatagramRecvSender_s.DatagramPort);
   //至少要指定数据报接收端口,这是对接收端的唯一要求.当然如果主机是多址主机,需要road=newDatagramSocket(sa);
   road=newDatagramSocket(DatagramRecvSender_s.DatagramPort);
   System.out.println(road.isBound() "::" road.getBroadcast());
  }
  catch(SocketExceptionex){
   ex.printStackTrace();
  }
  catch(Exceptionex1){
   ex1.printStackTrace();
  }
 }
 /**
 *这个构造器用于发送数据报.
 *@paramsendString
 */
 publicDatagramRecvSender_s(Stringsend){
  try{
   System.out.println("startsending...");
   ia=InetAddress.getByName("192.168.0.4");//"255.255.255.255""192.168.0.4""127.0.0.1"
   dsevent=newDataSwapEvent(this);
   SocketAddresssa=newInetSocketAddress(ia,
   DatagramRecvSender_s.DatagramPort);
   //如果需要接收数据报,就需要指定一个端口,否则不必指定.road=newDatagramSocket(DatagramRecvSender_s.DatagramPort-1);
   road=newDatagramSocket();
   System.out.println("isBound--" road.isBound() ":getBroadcast--" road.getBroadcast());
  }
  catch(SocketExceptionex){
   ex.printStackTrace();
  }
  catch(UnknownHostExceptionex1){
   ex1.printStackTrace();
  }
 }

 publicvoidsendFile(Stringfile){
  cdp=newDataPacket(file);
  System.out.println(file);
  Iteratorit=cdp.getDataPackets().iterator();
  byte[]b;
  while(it.hasNext()){
   b=((DataEntry)it.next()).getByte();
   //数据报是自包含的,自描述的数据,它的投递是由路由器执行的,路由器路由算法根据报文的目标地址选择适当的路由递送报文,
   //所以数据报中要指定目标IP地址和目标主机处理端口.

  • 上一篇文章:

  • 下一篇文章:
  •  

    0791-87557233

    重视每个来电 珍惜您的时间
    思诚者开发沙龙
    江西思诚科技有限公司  赣ICP备17006097号  CopyRight©2014 - 2018