使用UDP协议进行信息的传输之前不需要建议连接。换句话说就是客户端向服务器发送信息,客户端只需要给出服务器的ip地址和端口号,然后将信息封装到一个待发送的报文中并且发送出去。至于服务器端是否存在,或者能否收到该报文,客户端根本不用管。

通常我们讨论的udp的程序都是一对一的单播程序。本章将讨论一对多的服务:广播(broadcast)、多播(multicast)。对于广播,网络中的所有主机都会接收一份数据副本。对于多播,消息只是发送到一个多播地址,网络知识将数据分发给哪些表示想要接收发送到该多播地址的数据的主机。总得来说,只有UDP套接字允许广播或多播。

UDP广播

广播UDP与单播UDP的区别就是IP地址不同,广播使用广播地址255.255.255.255,将消息发送到在同一广播网络上的每个主机。值得强调的是:本地广播信息是不会被路由器转发。当然这是十分容易理解的,因为如果路由器转发了广播信息,那么势必会引起网络瘫痪。这也是为什么IP协议的设计者故意没有定义互联网范围的广播机制。

广播地址通常用于在网络游戏中处于同一本地网络的玩家之间交流状态信息等。广播就不在写演示程序了,读者可以将ECHO程序的ip地址改为广播地址即可。

其实广播顾名思义,就是想局域网内所有的人说话,但是广播还是要指明接收者的端口号的,因为不可能接受者的所有端口都来收听广播。

UDP多播

同样的UDP多播也要指明接受者的端口号,而且与广播相似的是多播与单播之间的区别还在于地址。ipv4中的多播地址范围是:224.0.0.0到239.255.255.255。在JAVA中,多播一样十分好实现,要实现多播,就要用到MulticastSocket类,其实该类就是DatagramSocket的子类,在使用时除了多播自己的一些特性外,把它当做DatagramSocket类使用就可以了。

使用java 的UDP进行广播,要分两步走,首先要加入到广播组地址,其次要建立套接字传输信息

关于广播,涉及到MulticastSocket,他用于接收广播的信息,前提是要将它加入到广播组,组播的地址是保留的D类地址从224.0.0.0—239.255.255.255,而且一些地址有特定的用处如,224.0.0.0—244.0.0.255只能用于局域网中路由器是不会转发的,并且224.0.0.1是所有主机的地址,224.0.0.2所有路由器的地址,224.0.0.5所有ospf路由器的地址,224.0.13事PIMv2路由器的地址;239.0.0.0—239.255.255.255是私有地址(如192.168.x..x);224.0.1.0—238.255.255.255可以用与Internet上的。这里我们就选取230.0.0.1作为我们的广播地址。

此软件类似于飞鸽,用于局域网通信,每个客户端上线都要寻找局域网其他主机并把自己的信息和所有主机交换,以此模式更新。。。

import java.net.DatagramPacket;

import java.net.DatagramSocket;

import java.net.InetAddress;

import java.net.MulticastSocket;

/**

*

项目名称:UDPMulticastDemo

*

类名称:lanDemo

*

类描述:

*

创建人:wuzq,zhongqianhit@163.com

*

创建时间:2012-6-7 上午10:21:06

*

修改人:wuzq,zhongqianhit@163.com

*

修改时间:2012-6-7 上午10:21:06

*

修改备注:

* @version

**/

class lanSend {

// 广播地址

private static final String BROADCAST_IP = "230.0.0.1";// 广播IP

private static final int BROADCAST_INT_PORT = 40005; // 不同的port对应不同的socket发送端和接收端

MulticastSocket broadSocket;// 用于接收广播信息

DatagramSocket sender;// 数据流套接字 相当于码头,用于发送信息

InetAddress broadAddress;// 广播地址

public lanSend() {

try {

// 初始化

broadSocket = new MulticastSocket(BROADCAST_INT_PORT);

broadAddress = InetAddress.getByName(BROADCAST_IP);

sender = new DatagramSocket();

} catch (Exception e) {

// TODO: handle exception

System.out.println("*****lanSend初始化失败*****" + e.toString());

}

}

void join() {

try {

broadSocket.joinGroup(broadAddress); // 加入到组播地址,这样就能接收到组播信息

new Thread(new GetPacket()).start(); // 新建一个线程,用于循环侦听端口信息

} catch (Exception e) {

// TODO: handle exception

System.out.println("*****加入组播失败*****");

}

}

// 广播发送查找在线用户

void sendGetUserMsg() {

byte[] b = new byte[1024];

DatagramPacket packet; // 数据包,相当于集装箱,封装信息

try {

b = ("find@" + lanDemo.msg).getBytes();

packet = new DatagramPacket(b, b.length, broadAddress,

BROADCAST_INT_PORT); // 广播信息到指定端口

sender.send(packet);

System.out.println("*****已发送请求*****");

} catch (Exception e) {

System.out.println("*****查找出错*****");

}

}

// 当局域网内的在线机子收到广播信息时响应并向发送广播的ip地址主机发送返还信息,达到交换信息的目的

void returnUserMsg(String ip) {

byte[] b = new byte[1024];

DatagramPacket packet;

try {

b = ("retn@" + lanDemo.msg).getBytes();

packet = new DatagramPacket(b, b.length, InetAddress.getByName(ip),

BROADCAST_INT_PORT);

sender.send(packet);

System.out.print("发送信息成功!");

} catch (Exception e) {

// TODO: handle exception

System.out.println("*****发送返还信息失败*****");

}

}

// 当局域网某机子下线是需要广播发送下线通知

void offLine() {

byte[] b = new byte[1024];

DatagramPacket packet;

try {

b = ("offl@" + lanDemo.msg).getBytes();

packet = new DatagramPacket(b, b.length, broadAddress,

BROADCAST_INT_PORT);

sender.send(packet);

System.out.println("*****已离线*****");

} catch (Exception e) {

// TODO: handle exception

System.out.println("*****离线异常*****");

}

}

class GetPacket implements Runnable { // 新建的线程,用于侦听

public void run() {

DatagramPacket inPacket;

String[] message;

while (true) {

try {

inPacket = new DatagramPacket(new byte[1024], 1024);

broadSocket.receive(inPacket); // 接收广播信息并将信息封装到inPacket中

message = new String(inPacket.getData(), 0,

inPacket.getLength()).split("@"); // 获取信息,并切割头部,判断是何种信息(find--上线,retn--回答,offl--下线)

if (message[1].equals(lanDemo.ip))

continue; // 忽略自身

if (message[0].equals("find")) { // 如果是请求信息

System.out.println("新上线主机:" + " ip:" + message[1]

+ " 主机:" + message[2]);

returnUserMsg(message[1]);

} else if (message[0].equals("retn")) { // 如果是返回信息

System.out.println("找到新主机:" + " ip:" + message[1]

+ " 主机:" + message[2]);

} else if (message[0].equals("offl")) { // 如果是离线信息

System.out.println("主机下线:" + " ip:" + message[1]

+ " 主机:" + message[2]);

}

} catch (Exception e) {

// TODO: handle exception

System.out.println("线程出错 " + e);

}

}

}

}

}

public class lanDemo {

// 全局变量

public static String msg;

public static String ip;

public static String hostName;

public static void main(String[] args) { // 程序入口点

lanSend lSend;

try {

InetAddress addr = InetAddress.getLocalHost();

ip = addr.getHostAddress().toString();

hostName = addr.getHostName().toString();

msg = ip + "@" + hostName;

lSend = new lanSend();

lSend.join(); // 加入组播,并创建线程侦听

lSend.sendGetUserMsg(); // 广播信息,寻找上线主机交换信息

Thread.sleep(10000); // 程序睡眠5秒

lSend.offLine(); // 广播下线通知

} catch (Exception e) {

System.out.println("*****获取本地用户信息出错*****");

}

}

}

java 局域网广播_java UDP实现局域网广播 | 学步园相关推荐

  1. java精确度_java的数值精度问题 | 学步园

    1.java的float和double是给科学计算用的,也就是说不能用于商业计算: 2.如果是商业计算那么必需使用java.math.BigDecimal,且必需要使用string来构造: (转载:h ...

  2. ls算法java实现_Java API之算法 | 学步园

    本节中所描述的多态 排序(Sorting) 排序算法可为一个 List 重新排序,以使它的元素按照某种排序关系成上升式排序.有两种形式的操作被提供.简单形式的操作只采用一个 List 并按照它的元素的 ...

  3. java 字长_java数据类型及其字长 | 学步园

    数据类型 大小 范围 默认值 byte(字节) 8 -128 - 127 0 shot(短整型) 16 -32768 - 32768 0 int(整型) 32 -2147483648-21474836 ...

  4. java 读取远程文件夹_java读取远程共享文件 | 学步园

    方式一: package example; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; impor ...

  5. java生成密码_java生成密码生成 | 学步园

    一.根据当前日期生成MD5加密密码 package com.test; import java.security.MessageDigest; import java.text.SimpleDateF ...

  6. java 接口初始化_Java类的初始化 | 学步园

    类的初始化时机1.创建类的实例 2.访问类或接口的静态变量(static final常量除外,static final变量可以)3.调用类的静态方法 4.反射(Class.forName(packag ...

  7. java md5加密解密_java MD5加密解密 | 学步园

    package com.md5; /** * @author 作者 E-mail: chenshaohua2012@126.com * @version 创建时间:2012-11-6 下午3:29:4 ...

  8. java 优化包_java美化界面包 | 学步园

    导入配置jar包 substance.jar 然后在frame的主函数 加入如下代码 JFrame.setDefaultLookAndFeelDecorated(true); JDialog.setD ...

  9. java 调用mysql视图_java 访问数据库视图 | 学步园

    工作多年调用视图到多次,自己写代码使用视图还是头一回,也觉得新鲜,那就开始呗, 数据库系统是Oracle 1 我用的数据库连接客户端是Navicat ,首先创建视图,其实视图就是调用表的操作,提取自己 ...

  10. java怎么把随机数放入数组_JAVA 生成随机数数组 | 学步园

    一.JAVA获取随机数的方法 //使用java.lang.Math类的random()方法 double a = Math.random(); System.out.println("0.0 ...

最新文章

  1. Kubernetes 网络排错指南
  2. SCCM 2012 SP1系列(七)分发部署exe软件
  3. Apache Subversion command line tools下载地址 svn命令行客户端
  4. 剑指Offer_编程题 不用加减乘除做加法
  5. qrcode方法生成的二维码安卓手机长按不识别
  6. urllib2.urlopen超时问题
  7. Nginx常见配置:负载均衡、限流、缓存、黑名单和灰度发布
  8. Windows平台下搭建Git服务器的图文教程
  9. html 伪元素原理,CSS伪类伪元素详解
  10. ArrayList集合排序方式总结
  11. 德拜方程及matlab实现
  12. 大数据分析:家庭教育的10个主要问题
  13. Stream操作666
  14. android微信小程序自动填表_微信小程序自动化实战(一)
  15. 家用洗地机实用吗?家用洗地机款式推荐
  16. 使用面向对象思想,输出员工信息并计算员工的工资。定义一个部门(Department)类,该类有部门编号(Id)、部门名称(Name)属性;再定义一个员工(Employee)类,该类的属性有员工编号
  17. 第十九章 Caché 函数大全 $INCREMENT 函数
  18. 安装RapidDesign_v1.3.0.Cracked.DX10.3.Rio
  19. python判断用户输入的数是正数还是负数
  20. 网络安全如何进行培训才有效

热门文章

  1. crmeb java单商户源码java二开文档部署文档H5商城部署文档【5】
  2. c语言的万能头文件,C/C 头文件太难记?万能头文件全搞定!
  3. maven缺失ojdbc6解决方法(手动安装ojdbc6)
  4. excel使用教程_【免费】人人入手的办公软件(excel,ppt,word)——安装包/教程/模板合集...
  5. 参加Oracle OCP和MySQL OCP考试的学员怎样在VUE预约考试
  6. linux安全加固-三级等保(一)
  7. java中元数据是什么_java 元数据
  8. 【路由器】Breed 介绍、刷入和使用
  9. 使用 Python 多处理库处理 3D 数据
  10. ppt设置外观样式_ppt怎么设置幻灯片的背景一样?