电信主站 网通分站
购买流程 付款方式 常见问题 在线提问 续租服务 购物车
用户名: 密 码: 忘记密码?
首 页
域名注册
虚拟主机
双线主机
服务器租用
VPS主机
企业邮局
代理专区
客服中心
虚拟主机行业资讯 虚拟主机评测对比 互联网最新动态 技术学院 站长资讯 在线教程 网站运营
搜索优化 服务器 网络编程 图形图象 站长之家 网页制作 操作系统
冲浪宝典 软件教学 视频通信 办公软件 邮件系统 网络安全 认证考试
您当前位置:西部数码->资讯中心-> 在线教程-> JSP教程
Java数据报编程之广播-JSP教程,数据库相关
作者:网友供稿 点击:48
  西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!虚拟主机可在线rar解压,自动数据恢复设置虚拟目录等.虚拟主机免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金!
文章页数:[1] 
 

udp广播,实际上是很简单的,理解ip编址方案,就理解什么是广播,很多文章称为多播,我认为称为广播比较好,因为多播是对广播和组播的泛指,在java程序中处理自然是不同的了,本文和下一篇只为强调概念.

正如前面所说,广播地址包括定向广播地址和有限广播地址,tcp/ip协议规定,这两种地址只能在本地网络中出现,路由器执行了这个规定,不把目标地址为广播地址的报文转发到其它网络,而组播就不同,下一篇介绍组播编程.

这个广播的程序可以简单的通过修改单播程序中的报文的目标地址成广播地址即可成为广播程序.

package recmail.multiservice;

import java.net.datagramsocket;
import java.net.*;
import java.io.*;
import java.util.arraylist;
import java.util.iterator;

public class datagramrecvsender_b extends dataswaplisteneradapter
    implements runnable {
  public static final int datagramport = 10698;
  private java.net.datagramsocket road;
  private inetaddress ia;
  datagrampacket dp;
  public static final int datagram_length = 8192;
  private datapacket cdp;
  private boolean ishandling = true;

  dataswapevent dsevent;
  /**
   * 这个构造器用于接收数据报.
   */
  public datagramrecvsender_b() {
    try {
      system.out.println("recv ...");
      dsevent = new dataswapevent(this);
      socketaddress sa = new inetsocketaddress(
                                               datagramrecvsender_b.datagramport);
      //至少要指定数据报接收端口,这是对接收端的唯一要求.当然如果主机是多址主机,需要road = new datagramsocket(sa);
      road = new datagramsocket(datagramrecvsender_b.datagramport);
      system.out.println(road.isbound()+"::"+road.getbroadcast());
    }
    catch (socketexception ex) {
      ex.printstacktrace();
    }
    catch (exception ex1) {
      ex1.printstacktrace();
    }
  }
  /**
   * 这个构造器用于发送数据报.
   * @param send string
   */
  public datagramrecvsender_b(string send) {
    try {
      system.out.println("send ...");
      //这个类可以计算本地网的定向广播地址.
      broadcastaddr info = new broadcastaddr();
      info.setnetmask("255.255.255.0");
      info.setnetaddr("192.168.0.106");
      info.execcalc();
      ia = inetaddress.getbyname(info.getnetbroadcastaddr());//"255.255.255.255"
      dsevent = new dataswapevent(this);
      socketaddress sa = new inetsocketaddress(ia,
                                               datagramrecvsender_b.datagramport);
      //如果需要接收数据报,就需要指定一个端口,否则不必指定.road = new datagramsocket(datagramrecvsender_s.datagramport-1);
      road = new datagramsocket();
      //datagramsocket类实例的getbroadcast()返回true,即该类的广播属性缺省设置是true,就是使能的.
      //road.setbroadcast(true);可以测试一下 当执行了road.setbroadcast(false)后会出现什么状况.
      system.out.println("isbound--"+road.isbound()+":getbroadcast--"+road.getbroadcast());
    }
    catch (socketexception ex) {
      ex.printstacktrace();
    }
    catch (unknownhostexception ex1) {
      ex1.printstacktrace();
    }
  }

  public void sendfile(string file) {
    cdp = new datapacket(file);
    system.out.println(file);
    iterator it = cdp.getdatapackets().iterator();
    byte[] b;
    while (it.hasnext()) {
      b = ( (dataentry) it.next()).getbyte();
      datagrampacket dp = new datagrampacket(b, 0, b.length, ia,datagramrecvsender_b.datagramport);
      try {
        thread.sleep(100);
        if(dp==null)
          continue;
        road.send(dp);
      }
      catch (exception ex) {
        ex.printstacktrace();
      }
    }
  }
 
  public boolean ishandling() {
    return ishandling;
  }

  public void ishandling(boolean ishand) {
    ishandling = ishand;
  }

  public void run() {
    byte[] buffer = new byte[datapacket.dataswapsize];
    datagrampacket packet = new datagrampacket(buffer, buffer.length);
    datapacket dp = new datapacket();
    while (ishandling) {
      packet.setlength(buffer.length);
      system.out.println("wait .. ");
      try {
        road.receive(packet);
        dp.add(packet.getdata());
        if (dp.isfull()) {
          dsevent.setimage(dp.gereratedata());
          this.processrecvfinishedevent(dsevent);
          dp = new datapacket();
        }
      }
      catch (ioexception ex) {
        system.out.println(ex);
      }
    }
  }

  public static void main(string[] args) {
    string file[];
    arraylist al = new arraylist();
    //换成你机器上的图象文件夹
    string path = "e:\\nature\\";
    file f = new file(path);
    file = f.list();
    datagramrecvsender_b dgrs = new datagramrecvsender_b("");
    for(int j=0;j<1000;j++)
    for (int i = 0; i < file.length; i++) {
      try {
        thread.sleep(2000);
      }
      catch (interruptedexception ex) {
      }
      if (file[i].endswith("jpg") || file[i].endswith("bmp"))
        dgrs.sendfile(path + file[i]);
    }
  }
}

  public static void main(string[] args) {
    string file[];
    arraylist al = new arraylist();
    string path = "e:\\nature\\"; //nature mzip
    file f = new file(path);
    file = f.list();
    datagramrecvsender_b dgrs = new datagramrecvsender_b("");
    for(int j=0;j<1000;j++)
    for (int i = 0; i < file.length; i++) {
      try {
        thread.sleep(2000);
      }
      catch (interruptedexception ex) {
      }
      if (file[i].endswith("jpg") || file[i].endswith("bmp"))
        //system.out.println(file[i]);
        //al.add(path + file[i]);
        dgrs.sendfile(path + file[i]);
    }
  }
}

接收端显示界面和单播相同,修要修改的只有一句:

在类testdual的main方法中,把datagramrecvsender_s改为datagramrecvsender_b即可,把接收端放到你的局域网上的几个机器上同时运行,你应该会看到不断显示的图象.

  public static void main(string[] args) {
    testdual test = new testdual();
    test.initmain();
    test.go();
    datagramrecvsender_s dgrs = new datagramrecvsender_s();
    dgrs.adddataswaplistener(test);
    thread thread = new thread(dgrs, "test");
    thread.start();
  }

下一篇介绍组播编程.


文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!
相关主题
文章页数:[1] 
Google
热门文章
·IReport与JasperReport开发详解一-JSP教程,Java技巧及代码
·JSTL(JSP标准标签库)介绍-JSP教程,资料/其它
·格式化输入日期时间控件 JieFormattedDateBox-JSP教程,Java技巧及代码
·JSTL简化JSP编码-JSP教程,Jsp/Servlet
·JUnit和单元测试入门简介-JSP教程,Java技巧及代码
·从数据库中读取一个图片并保存为一个图片文件-JSP教程,数据库相关
·Java Swing入门基础-JSP教程,Java技巧及代码
·IntelliJ IDEA培训-JSP教程,Java技巧及代码
·通过JSP的预编译消除性能瓶颈-JSP教程,Jsp/Servlet
·Java中利用JMF编写摄像头拍照程序-JSP教程,Java技巧及代码

最新文章
·J2ME中的时间处理方法
·J2ME播放声音流程简介
·J2ME开发之手机键盘使用注意问题
·J2ME 记录管理存储
·MVC模式在j2me项目中的应用(二)
·MVC模式在j2me项目中的应用(一)
·J2ME中使用记录存储系统(RMS)存储信息
·J2ME与MIDP开发(1)
·用简单的J2ME程序测试MIDlet的生命周期
·JAVA基础:提升JSP应用程序的七大绝招


 
 


版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!

特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
  打印  刷新  关闭
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 虚拟主机 | 资讯中心 | 友情链接 | 网站地图

版权所有 西部数码(www.west263.com)
CopyRight (c) 2002~2006 west263.com all right reserved.
公司地址:四川成都市万和路90号天象大厦4楼 邮编:610031
电话总机:028-86262244 86263048 86263408 86263960 86264018 86267838
售前咨询:总机转201 202 203 204 206 208
售后服务:总机转211 212 213 214
财务咨询:总机转224 223 传真:028-86264041 财务QQ:点击发送消息给对方635483282
售前咨询QQ:点击发送消息给对方2182518 点击发送消息给对方241975952 点击发送消息给对方275026793 点击发送消息给对方408235859
售后服务QQ:点击发送消息给对方17708515 点击发送消息给对方307742704 点击发送消息给对方287976517 点击发送消息给对方363783715
《中华人民共和国增值电信业务经营许可证》编号:川B2-20030065号