在 IP 协议层,有多播、广播的概念。IP 地址分为网络地址和主机地址,主机地址全部为1,就是广播地址。多播使用 D 类地址,从 224.0.0.0 到 239.255.255.255。IP 多播需要 IGMP 的支持,大致是,需要接收多播的主机先向路由器进行注册,然后路由器在收到多播包后会转发给注册的主机。

java 语言实现多播、广播要用到 MulticastSocket,DatagramSocket。

多播发送:

package com.zhang;

import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket; public class Multicast_Send {
public static void main(String[] args) {
String[] message = { "hello", "hi" };
int port = 1234; // 端口
InetAddress group = null; // 地址
MulticastSocket multicastSocket = null; // 组播套接字 try {
group = InetAddress.getByName("239.1.1.1"); // 设置多播地址
multicastSocket = new MulticastSocket(port);
// 设置数据包的ttl,值从0到255,应该是和ip包的ttl字段对应上了
// 之前设置为1,在无限局域网中,数据包无法到达其他主机,所以这里设为2
// 如果设为0,则只能发送给本机
multicastSocket.setTimeToLive(2);
multicastSocket.joinGroup(group);
} catch (Exception e) {
e.printStackTrace();
} while (true) {
try {
DatagramPacket packet = null;
for (String msg : message) // 循环发送每条广播信息
{
msg = msg + "," + System.currentTimeMillis();
byte buff[] = msg.getBytes();
packet = new DatagramPacket(buff, buff.length, group, port);
multicastSocket.send(packet);
System.out.println("send:" + msg);
Thread.sleep(2000);
}
} catch (Exception e) {
System.out.println("Error:" + e);
}
} }
}

多播接收:

package com.zhang;

import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket; public class Multicast_Recv {
public static void main(String[] args) throws Exception {
InetAddress group = InetAddress.getByName("239.1.1.1");
int port = 1234;
MulticastSocket socket = new MulticastSocket(port);
socket.joinGroup(group); while (true) {
byte buff[] = new byte[8192];
DatagramPacket packet = null;
packet = new DatagramPacket(buff, buff.length, group, port);
socket.receive(packet);
String message = new String(packet.getData(), 0, packet.getLength());
System.out.println("receive:" + message);
}
}
}

广播发送:

package com.zhang;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress; public class Broadcast_Send {
public static void main(String[] args) {
// 本机ip:10.3.80.248, 子网掩码:255.255.255.0,推出广播地址:10.3.80.255
String host = "10.3.80.255"; // 广播地址
int port = 9999; // 广播的目的端口
String message = null; // 用于发送的字符串
try {
while (true) {
message = "hello world " + System.currentTimeMillis();
InetAddress addr = InetAddress.getByName(host);
DatagramSocket ds = new DatagramSocket();
DatagramPacket dp = new DatagramPacket(message.getBytes(),
message.length(), addr, port);
ds.send(dp);
Thread.sleep(2000);
// ds.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

广播接收:

package com.zhang;

import java.net.DatagramPacket;
import java.net.DatagramSocket; public class Broadcast_Recv {
public static void main(String[] args) {
int port = 9999; // 开启监听的端口
DatagramSocket ds = null;
DatagramPacket dp = null;
byte[] buf = new byte[1024];// 存储发来的消息
try {
// 绑定端口
ds = new DatagramSocket(port);
dp = new DatagramPacket(buf, buf.length);
System.out.println("监听广播端口打开:"); while (true) {
ds.receive(dp);
System.out.println("收到广播消息:" + new String(buf));
} // ds.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}

java 中多播、广播编程的更多相关文章

  1. 第62节:探索Java中的网络编程技术

    前言 感谢! 承蒙关照~ 探索Java中的网络编程技术 网络编程就是io技术和网络技术的结合,网络模型的定义,只要共用网络模型就可以两者连接.网络模型参考. 一座塔有七层,我们需要闯关. 第一层物理层 ...

  2. Java中的网络编程

    ​ Java中的网路编程主要是Java的Socket编程,属于JavaEE中的高级的部分,以下内容是对java网路编程的一个小结,代码都是经过编译调试的 C/S程序应用:客户/服务器模式,如QQ客户端 ...

  3. 读懂Java中的Socket编程

    Socket,又称为套接字,Socket是计算机网络通信的基本的技术之一.如今大多数基于网络的软件,如浏览器,即时通讯工具甚至是P2P下载都是基于Socket实现的.本文会介绍一下基于TCP/IP的S ...

  4. 读懂Java中的Socket编程(转)

    Socket,又称为套接字,Socket是计算机网络通信的基本的技术之一.如今大多数基于网络的软件,如浏览器,即时通讯工具甚至是P2P下载都是基于Socket实现的.本文会介绍一下基于TCP/IP的S ...

  5. Java 中的函数式编程(Functional Programming):Lambda 初识

    Java 8 发布带来的一个主要特性就是对函数式编程的支持. 而 Lambda 表达式就是一个新的并且很重要的一个概念. 它提供了一个简单并且很简洁的编码方式. 首先从几个简单的 Lambda 表达式 ...

  6. 第84节:Java中的网络编程(中)

    第84节:Java中的网络编程(中) 实现客户端和服务端的通信: 客户端需要的操作,创建socket,明确地址和端口,进行键盘录入,获取需要的数据,然后将录入的数据发送给服务端,为socket输出流, ...

  7. 第78节:Java中的网络编程(上)

    第78节:Java中的网络编程(上) 前言 网络编程涉及ip,端口,协议,tcp和udp的了解,和对socket通信的网络细节. 网络编程 OSI开放系统互连 网络编程指IO加网络 TCP/IP模型: ...

  8. Java中的 多线程编程

    Java 中的多线程编程 一.多线程的优缺点 多线程的优点: 1)资源利用率更好2)程序设计在某些情况下更简单3)程序响应更快 多线程的代价: 1)设计更复杂虽然有一些多线程应用程序比单线程的应用程序 ...

  9. java中的socket编程

    Socket,又称为套接字,Socket是计算机网络通信的基本的技术之一.如今大多数基于网络的软件,如浏览器,即时通讯工具甚至是P2P下载都是基于Socket实现的.本文会介绍一下基于TCP/IP的S ...

  10. Java中的函数式编程(三)lambda表达式

    写在前面 lambda表达式是一个匿名函数.在Java 8中,它和函数式接口一起,共同构建了函数式编程的框架.   lambda表达式乍看像是匿名内部类的一种语法糖,但实际上,它们是两种本质不同的事物 ...

随机推荐

  1. _attribute_creature

    生物属性控制表 comment 备注 Entry 生物ID,对就creature_template中entry Level 不等于0时改变等级为该值 Health 不等于0时改变生命值为该值 Atta ...

  2. bzoj 2243: [SDOI2011]染色 线段树区间合并+树链剖分

    2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 7925  Solved: 2975[Submit][Status ...

  3. strtotime 获取之前,之后时间

    一年之前 <?php echo strtotime('-1 year'); ?> 一年之后 <?php echo strtotime('+1 year'); ?> 一月之前 & ...

  4. gensim使用方法以及例子

    来自:https://blog.csdn.net/u014595019/article/details/52218249 gensim是一个Python的自然语言处理库,能够将文档根据TF-IDF,L ...

  5. Cross Validation(交叉验证)

    交叉验证(Cross Validation)方法思想 Cross Validation一下简称CV.CV是用来验证分类器性能的一种统计方法. 思想:将原始数据(dataset)进行分组,一部分作为训练 ...

  6. scala函数式编程(一)

    scala函数编程特点: 1.Scala函数使用命名参数: 即函数参数传递的实参与函数名相对应,与函数位置不对应. object Test { def main(args: Array[String] ...

  7. Nordic SDK例程目录结构

    Nordic SDK例程目录结构为:SDK版本/ examples /协议角色/例子名称/开发板型号/协议栈型号/工具链类型/具体工程 Nordic每一个例子都支持5种工具链:Keil5/Keil4/ ...

  8. lua --- __newindex

    -- __newindex 对表进行更新 MyMetatable = {} MyTable = }, {__newindex = MyMetatable}) MyTable.newKey1 = pri ...

  9. reactiveCocoa使用

    @代理 简介:使用RACSubject信号替换 控制器2的操作: <1在头文件定义一个信号: @property (nonatomic, strong) RACSubject *delegate ...

  10. SpringBoot集成TkMybatis插件 (二)

    一.Tkmybatis的好处 Tkmybatis是在mybatis框架的基础上提供了很多工具,让开发更加高效.这个插件里面封装好了我们需要用到的很多sql语句,不过这个插件是通过我们去调用它封装的各种 ...