java的udp广播

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();
  } 

时间: 2024-12-21 13:35:08

java的udp广播的相关文章

Android编程实现基于局域网udp广播自动建立socket连接的方法_Android

本文实例讲述了Android编程实现基于局域网udp广播自动建立socket连接的方法.分享给大家供大家参考,具体如下: android开发中经常会用到socket通讯.由于项目需要,最近研究了一下这方面的知识. 需求是想通过wifi实现android移动设备和android平台的电视之间的文件传输与控制. 毫无疑问这中间一定需要用到socket来进行通信.今天就两台设备的握手连接方式分享一下吧,该方法只是本人个人想法的实现,仅供参考,如有雷同,不胜荣幸. 要想使用socket进行通讯,就必须知

udp-需要一个java基于UDP协议的文件传输程序

问题描述 需要一个java基于UDP协议的文件传输程序 文件是一个实验数据的文件,是txt个格式的,需要将它传输到指定的IP上 解决方案 server package com.way.server;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundEx

java解析UDP报文,报文的处理

问题描述 java解析UDP报文,报文的处理 我会从单片机收到S5W1449!p1r!p1r003B1s!S6WGGG00!p2r!p2r00003!这样的数据,我要把每位提取出来.共有九位数据,第八位是校验位,!是结束位.我不太懂java是怎么进行处理的,因为一直收数据,我处理好之后要显示在界面上,要一直更新,我是收到一帧数据处理完之后,在接收,还是具体怎么接收的,要把之后的数据一直缓存吗?我要怎么写呢? 解决方案 8583报文 55域JAVA的解析 解决方案二: 这类的程序,应该实现成,接收

udp 广播 界面卡死

问题描述 udp 广播 界面卡死 各位大大,我在做iphone手机软件时,得用到udp广播收发数据,但这过程中会出现界面卡死的现象,请问有前辈碰到这头疼的问题没?求解释......谢谢了 解决方案 我也是这样,求解啊~~~

基于vb.net的udp广播收发,能发不能收,代码贴上

问题描述 基于vb.net的udp广播收发,能发不能收,代码没提示错误,也不知道哪里有问题,请各位大神帮忙一下,运行起来,能发不能收.我要实现的是基于vb.net的udp广播收发,麻烦各位大神帮忙看看代码哪里出错了,跪求帮忙...代码贴上.发送端:ImportsSystemImportsSystem.NetImportsSystem.Net.SocketsImportsSystem.TextPublicClassfrmMainInheritsSystem.Windows.Forms.FormPr

c#net-C#使用udp广播如何获取收到广播后反馈的ip地址

问题描述 C#使用udp广播如何获取收到广播后反馈的ip地址 C#使用udp广播如何获取收到广播后反馈的ip地址................... 解决方案 你要用C#重新模拟ARP广播? 我们做实验都是wireshark捕捉的说. 解决方案二: 可以参考wireshark的捕捉的机理~我也不懂...

服务器-如何利用UDP广播,给同一台电脑的多个客户端发送数据

问题描述 如何利用UDP广播,给同一台电脑的多个客户端发送数据 项目要求一台电脑同时开启多个同样客户端,同时接受服务器发送过来的数据.我想利用UDP广播实现,但是发现,多个客户端不能绑定同一个端口.这怎么实现啊.请教各位大神,小弟万分感谢! 解决方案 这个是很基础的UDP 协议,这个篇文章看能不能够帮到你:http://blog.csdn.net/qq_21792169/article/details/50412940 解决方案二: 我是想同一台电脑的多个客户端都接收另一台电脑发送过来的数据,但

udp-socket编程实现UDP广播的问题

问题描述 socket编程实现UDP广播的问题 用socket实现UDP的广播时,sendto函数发送广播消息正常,但是其他vxsim的recvfrom函数未被调用,也就是说广播消息发出去了,但是其他vxsim都未接收到,这是怎回事?

udp-如何在Tornado2.2中实现UDP广播

问题描述 如何在Tornado2.2中实现UDP广播 在Tornado2.2中实现UDP广播,用几个vxsim模拟实现可以么?