首 页 网络编程
网页制作 图形图象 操作系统 冲浪宝典
软件教学 认证考试

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 图形图象-> FIREWORKS教程
Java数据报编程之组播-JSP教程,Java技巧及代码
作者:网友供稿 点击:37
推荐
西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金
站内搜索
文章页数:[1] 
 

在信息时代,网络技术应用已经很普通。其中很多应用都依赖于从一个主机向多个主机或者从多个主机向多个主机发送同一信息的能力,在internet上分发的数目可能达数十万台,这些都需要更高的带宽,并且大大超出了单播的能力。一种能最大限度地利用现有带宽的重要技术是ip组播。


1.ip组播技术的概念

ip组播技术,是一种允许一台或多台主机(组播源)发送单一数据包到多台主机(一次的,同时的)的tcp/ip网络技术,是一点对多点的通信。在网络多媒体广播的应用中,当需要将一个节点的信号传送到多个节点时,无论是采用重复点对点通信方式,还是采用广播方式,都会严重浪费网络带宽,只有组播才是最好的选择。组播能使一个或多个组播源只把数据包发送给特定的组播组,而只有加入该组播组的主机才能接收到数据包。

2.ip组播地址

ip组播通信依赖于ip组播地址,在ipv4中它是一个d类ip地址,范围从224.0.0.0到239.255.255.255,并被划分为局部链接组播地址、预留组播地址和管理权限组播地址三类。其中,局部链接组播地址范围在224.0.0.0~224.0.0.255,这是为路由协议和其它用途保留的地址,路由器并不转发属于此范围的ip包;预留组播地址为224.0.1.0~238.255.255.255,可用于全球范围(如internet)或网络协议;管理权限组播地址为239.0.0.0~239.255.255.255,可供组织内部使用,类似于私有ip地址,不能用于internet,可限制组播范围。

3.组播组

使用同一个ip组播地址接收组播数据包的所有主机构成了一个主机组,也称为组播组。一个组播组的成员是随时变动的,一台主机可以随时加入或离开组播组,组播组成员的数目和所在的地理位置也不受限制,一台主机也可以属于几个组播组。此外,不属于某一个组播组的主机也可以向该组播组发送数据包。

本文使用multicastsocket类的实例编写组播应用,multicastsocket类提供连接和离开组播等操作。

multisender类清单

package recmail.multiservice;

import java.net.*;
import java.io.ioexception;

/**
 * 该类封装了multicastsocket类,完成了multicastsocket类实例的创建、初始化功能,
 * 并提供了一个发送数据的接口.
 */

public class multisender {
  public static final int multisender_port=4099;
  private multicastsocket road;
  private inetaddress ia;

  public multisender() {
    try {

      //组播地址
      ia = inetaddress.getbyname("239.66.69.18");
      road = new multicastsocket(multisender_port);
      road.joingroup(ia);
    }
    catch (unknownhostexception ex) {
    }
    catch (ioexception ex1) {
    }
  }
  public inetaddress getinetaddress(){
    return ia;
  }
  public multicastsocket getroad(){
    return road;
  }
  public void send(byte[] b){
    datagrampacket dp = new datagrampacket(b, 0, b.length,
                                               ia, multisender.multisender_port);
    try {
      road.send(dp);
    }
    catch (ioexception ex) {
      ex.printstacktrace();
    }
  }
}

imageserver类,使用上面的类发送文件数据.

package recmail.multiservice;
import java.io.*;
import javax.swing.timer;
import java.awt.event.*;
import java.awt.image.*;
import java.util.*;
import java.io.filefilter;
import java.io.filenamefilter;

/**
 * 本类利用multisender类发送文件数据到一个组播组发送数据.
 */

public class imageserver
    extends thread implements actionlistener {
  timer timer;
  bufferedimage image;
  arraylist streamfragments;
  int counter = 0;
  byte[] imagebyte;
  arraylist listener;
  multisender sender;

  public imageserver(arraylist f) {
    timer = new timer(50, this);
    timer.addactionlistener(this);
    listener = new arraylist();
    streamfragments = f;
    sender = new multisender();
    timer.start();
  }

  public void adddataswaplistener(dataswaplistener dsl) {
    listener.add(dsl);
  }

  public void removedataswaplistener(dataswaplistener dsl) {
    listener.remove(dsl);
  }

  private void processevent() {
    for (int i = 0; i < this.listener.size(); i++) {
      dataswapevent dse = new dataswapevent();
      ( (dataswaplistener)this.listener.get(i)).ondatasendfinished(this, dse);
    }
  }

  public void actionperformed(actionevent e) {
    datapacket dp = new datapacket(streamfragments.get(counter).tostring());
    dataentry de;
    try {
      arraylist al = dp.getdatapackets();
      thread.sleep(1000);
      system.out.println(streamfragments.get(counter).tostring());
      for (int i = 0; i < al.size(); i++) {
        imagebyte = ( (dataentry) al.get(i)).getbyte(); //(byte[]) al.get(i);
        sender.send(imagebyte);
      }
      this.processevent();
    }
    catch (exception ex) {
      system.out.println(ex);
    }
    counter++;
    if (counter >= streamfragments.size())
      counter = 0;
  }

  public void run() {
    while (true) {
      try {
        this.sleep(20);
      }
      catch (interruptedexception ex) {
      }
    }
  }

  public static void main(string[] args) {
    string file[];
    arraylist al = new arraylist();
    string path = "e:\\mzip\\"; 
    file f = new file(path);
    file = f.list();
    for (int i = 0; i < file.length; i++) {
      if (file[i].endswith("jpg") || file[i].endswith("bmp")) 
        al.add(path + file[i]);
    }
    imageserver is = new imageserver(al);
    is.start();
  }
}

package recmail.multiservice;

import java.net.*;
import java.io.*;
import java.awt.image.*;
/**
 * 该类封装了multicastsocket类,完成了multicastsocket类实例的创建、初始化功能,
 * 并提供一个接收数据的线程,在判断接收完毕后产生事件,更新ui显示.
 * 该类由testframe使用.
 */
public class imageshow
    extends dataswaplisteneradapter
    implements runnable {
  private inetaddress ia;
  private int port = 4099;
  private multicastsocket road;
  dataswapevent dsevent;
  java.awt.image.bufferedimage bi;

  public imageshow() {
    dsevent = new dataswapevent(this);
    try {
      ia = inetaddress.getbyname("239.66.69.18");
      road = new multicastsocket(port);
      road.joingroup(ia);
    }
    catch (ioexception ex) {
    }
  }

  public void run() {
    byte[] buffer = new byte[datapacket.dataswapsize];
    datagrampacket packet = new datagrampacket(buffer, buffer.length);
    datapacket dp = new datapacket();
    while (true) {
      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);
      }
    }
  }
}

接收端界面类:

package recmail.multiservice;

import javax.swing.*;
import java.awt.*;
import java.awt.image.*;

/**
 * 该类使用imageshow更新显示的图象.
 */

public class testframe
    extends japplet
    implements dataswaplistener {
  private jpanel root;
  jlabel label;
  jimagepanel ip;
  java.awt.image bi;

  public testframe() {
    initmain();
  }

  public void init() {
    initmain();
    this.setcontentpane(root);
    imageshow is = new imageshow();
    is.adddataswaplistener(this);
    thread thread = new thread(is, "test");
    thread.start();
  }

  public static void main(string[] args) {
    testframe test = new testframe();
    test.go(new jframe());
    imageshow is = new imageshow();
    is.adddataswaplistener(test);
    thread thread = new thread(is, "test");
    thread.start();
  }

  public void go(jframe frame) {
    frame.setcontentpane(root);
    frame.setsize(300, 200);
    frame.setdefaultcloseoperation(jframe.exit_on_close);
    frame.validate();
    frame.setvisible(true);
  }

  public void initmain() {
    root = new jpanel();
    //label = new jlabel();
    ip = new jimagepanel();
    root.setlayout(new borderlayout(5, 5));
    root.add(ip, borderlayout.center);
  }

  public void setrefreshimage(java.awt.image.bufferedimage img) {
    this.bi = img;
    ip.setimage(bi);
  }

  public void paint(graphics g) {
    super.paint(g);
  }

  public void paintcomponents(graphics g) {
    super.paintcomponents(g);
    graphics g1 = root.getgraphics();
    g1.drawimage(bi, 0, 0, this);
  }

  public void ondatasendfinished(object s, dataswapevent e) {

  }

  public void ondatarecvfinished(object s, dataswapevent e) {
    this.bi = e.getimage();
    ip.setimage(bi);
    system.out.println("recv finished!");
  }
}

到此,这个多播程序编写完毕,通过这个程序可以看出在java中进行组播编程有两个特点,一是使用java的multicastsocket类,二是使用组播地址配置multicastsocket实例.

数据报编程的全部内容已结束,如果要改进,可以在两个方面进行,一个是改善传输的可靠性方面,一个是采用数据收发的异步方面,因为在j2sdk1.4中multicastsocket类增加了方法getchannel().



文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

文章页数:[1] 


放大字体显示 缩小字体显示 打印文章 推荐给朋友
热门文章
·Java集合框架-JSP教程,Java技巧及代码
·ASP.NET2.0下含有DropDownList的GridView编辑、删除的完整例子!-.NET教程,评论及其它
·icl8038扫频信号发生器
·基于ASP.NET的自定义分页显示-ASP教程,ASP技巧
·DataGrid的常见问题-.NET教程,数据库应用
·ASP 调用 ORACLE存储过程并返回结果集-ASP教程,数据库相关
·RadioButtonList在Datagrid模板列中的应用-ASP教程,数据库相关
·深入剖析JSP和Servlet对中文的处理过程-JSP教程,Jsp/Servlet
·关于c#中的消息处理函数和vc中的消息处理函数区别-.NET教程,C#语言
·fireworks制作字体遮罩动画
最新文章
·如何来做好你的第一个网站_站长心得
·google广告优化技巧总结_网赚技巧
·陈宗:网络2.0是很有前景的_站长访谈
·做一个打不死的个人站长_站长心得
·photoshop蒙板打造梦幻美丽风景_photoshop教程
·拿什么拯救你 痴迷网站的站长_站长心得
·google adwords的优化技巧_google推广
·经验之谈:web建站之网站宣传_站长心得
·针对搜索引擎title的写法_站长心得
·alexa 世界网站排名研究_alexa排名
相关主题
  • Java数据报编程之单播-JSP教程,数据库相关
  • Java数据报编程之广播-JSP教程,数据库相关
  • Java数据报之失序和丢包-JSP教程,Java技巧及代码
  • Java数据报编程之概说-JSP教程,Java技巧及代码
  • Java数据报编程之测试程序-JSP教程,Java技巧及代码
  • 西部数码虚拟主机

    友情链接
    CNNIC 西部数码
    万网 自助建站
    虚拟主机 asp空间
    域名注册 域名
    域名申请 主页空间
    论坛空间 网站空间
    国际域名 虚拟空间
    空间租用 DDOS防火墙
    成都主机托管 四川主机托管
    主机租用 服务器租用
    网站目录 自助建站
    虚拟主机 网址大全
    软件下载
    自助链接
    虚拟主机资讯 特价虚拟主机
    版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
    关于我们:站长天空:专业提供最新的站长资讯、在线教程、虚拟主机权威评测、虚拟主机性能对比、网站制作教程,开发教程,站长工具。包括网页制作教程、冲浪宝典、编程参考、操作系统、软件教学、行业动态等。
    特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
    发表评论 打印  刷新     关闭