在 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. 基于 Python 和 Pandas 的数据分析(1)

    基于 Python 和 Pandas 的数据分析(1) Pandas 是 Python 的一个模块(module), 我们将用 Python 完成接下来的数据分析的学习. Pandas 模块是一个高性 ...

  2. codeforces 768E Game of Stones

    题目链接:http://codeforces.com/problemset/problem/768/E NIM游戏改版:对于任意一堆,拿掉某个次数最多只能一次. 对于一堆石头数量为$X$.找到一个最小 ...

  3. CentOS6.5下卸载自带的MySQL数据库安装MySQL5.6

    1)查看CentOS自带的mysql 输入 rpm -qa | grep mysql mysql-libs-5.1.71-1.el6.x86_64 2)将其自带的mysql版本全部卸载(非常重要,如不 ...

  4. Integer的最大值

    来自:https://blog.csdn.net/qq_33611068/article/details/77369050 有这样一道题: 编程测试,遍历 0 到 int所能表示最大的正数,将消耗的时 ...

  5. Java——文件及目录File操作

    API file.listFiles(); //列出目录下所有文件及子目录fileList[i].isFile() //判断是否为文件 fileList[i].isDirectory() //判断是否 ...

  6. vscode所用插件

  7. 力扣(LeetCode)258. 各位相加

    给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数. 示例: 输入: 38 输出: 2 解释: 各位相加的过程为:3 + 8 = 11, 1 + 1 = 2. 由于 2 是一位数,所 ...

  8. this 指向 及 调用方式

    1. this 指向 函数执行方式 this指向1.直接圆括号 window2.对象调用 对象3.事件触发 触发对象4.定时器运行 window (常常定义变量存储this以达到this指向特定对象) ...

  9. ES6 学习笔记(整理一遍阮一峰大神得入门文档,纯自己理解使用)

    1.let命令 1)let和var的区别:let声明的变量只有所在的代码块有效. 2)没有变量的提升,一定要声明后使用.使用let命令声明变量之前,该变量都是不可用的.形成“暂时性死区”. 3)typ ...

  10. 在python中使用正则表达式(二)

    这一节主要学习一下compile()函数和group()方法 1.  re.compile() compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,然后就可以用编译后 ...