java网络编程: UDP 广播与多播的实现
2016-06-29 14:20
691 查看
1、广播:
同一网段所有主机都能接收,前提是端口要监听
客户端发送广播,开启端口监听的服务端接收并打印消息
服务端程序:
发送端程序:
2、多播
多播数据报套接字类用于发送和接收 IP 多播包。MulticastSocket 是一种 (UDP) DatagramSocket,它具有加入 Internet 上其他多播主机的“组”的附加功能。
多播组通过 D 类 IP 地址和标准 UDP 端口号指定。D 类 IP 地址在
可以通过首先使用所需端口创建 MulticastSocket,然后调用
服务器端程序:
客户端程序:
简单实现了一下基于UDP的广播和多播的功能,主要是理解多播和广播的概念。尤其是组播,以前停留在概念上,只知道是传送给一组主机而不是所有主机,今天才豁然了。
同一网段所有主机都能接收,前提是端口要监听
客户端发送广播,开启端口监听的服务端接收并打印消息
服务端程序:
import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException; public class TestServer { public static void main(String[] args) { int port = 9999;//开启监听的端口 DatagramSocket ds = null; DatagramPacket dp = null; byte[] buf = new byte[1024];//存储发来的消息 StringBuffer sbuf = new StringBuffer(); try { //绑定端口的 ds = new DatagramSocket(port); dp = new DatagramPacket(buf, buf.length); System.out.println("监听广播端口打开:"); ds.receive(dp); ds.close(); int i; for(i=0;i<1024;i++){ if(buf[i] == 0){ break; } sbuf.append((char) buf[i]); } System.out.println("收到广播消息:" + sbuf.toString()); } catch (SocketException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
发送端程序:
import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import java.net.UnknownHostException; public class Test { public static void main(String[] args) { // 广播的实现 :由客户端发出广播,服务器端接收 String host = "255.255.255.255";//广播地址 int port = 9999;//广播的目的端口 String message = "test";//用于发送的字符串 try { InetAddress adds = InetAddress.getByName(host); DatagramSocket ds = new DatagramSocket(); DatagramPacket dp = new DatagramPacket(message.getBytes(), message.length(), adds, port); ds.send(dp); ds.close(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (SocketException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
2、多播
多播数据报套接字类用于发送和接收 IP 多播包。MulticastSocket 是一种 (UDP) DatagramSocket,它具有加入 Internet 上其他多播主机的“组”的附加功能。
多播组通过 D 类 IP 地址和标准 UDP 端口号指定。D 类 IP 地址在
224.0.0.0和
239.255.255.255的范围内(包括两者)。地址 224.0.0.0 被保留,不应使用。
可以通过首先使用所需端口创建 MulticastSocket,然后调用
joinGroup(InetAddress groupAddr)方法来加入多播组:(以上是jdk-doc的说明,补充如下:服务器和客户端必须都要加入相同的组播地址才可以)
服务器端程序:
import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.MulticastSocket; import java.net.SocketException; public class TestServer { public static void main(String[] args){ //接受组播和发送组播的数据报服务都要把组播地址添加进来 String host = "225.0.0.1";//多播地址 int port = 9998; int length = 1024; byte[] buf = new byte[length]; MulticastSocket ms = null; DatagramPacket dp = null; StringBuffer sbuf = new StringBuffer(); try { ms = new MulticastSocket(port); dp = new DatagramPacket(buf, length); //加入多播地址 InetAddress group = InetAddress.getByName(host); ms.joinGroup(group); System.out.println("监听多播端口打开:"); ms.receive(dp); ms.close(); int i; for(i=0;i<1024;i++){ if(buf[i] == 0){ break; } sbuf.append((char) buf[i]); } System.out.println("收到多播消息:" + sbuf.toString()); } catch (IOException e) { e.printStackTrace(); } } }
客户端程序:
import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.MulticastSocket; import java.net.SocketException; import java.net.UnknownHostException; public class Test { public static void main(String[] args){ String host = "225.0.0.1";//多播地址 int port = 9998; String message = "test-multicastSocket"; try { InetAddress group = InetAddress.getByName(host); MulticastSocket s = new MulticastSocket(); //加入多播组 s.joinGroup(group); DatagramPacket dp = new DatagramPacket(message.getBytes(),message.length(),group,port); s.send(dp); s.close(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
简单实现了一下基于UDP的广播和多播的功能,主要是理解多播和广播的概念。尤其是组播,以前停留在概念上,只知道是传送给一组主机而不是所有主机,今天才豁然了。
相关文章推荐
- node.js http
- AutoCAD单机版、网络版授权方法
- java网络编程:MulticastSocket类
- R-FCN:基于区域的全卷积网络来检测物体
- java网络编程:DatagramSocket类简单实现文件下载
- java网络编程:DatagramSocket类
- Swift网络封装库Moya中文手册之Targets
- HTTP状态码及其含义
- Unity判断网络是否连接 以及 判断是否连接WiFi
- 使用自定义签名的https的ssl安全问题解决和metro的webservice调用
- 子网掩码的计算及与子网数、主机数关系
- httpd简介
- Google深度学习笔记 循环神经网络实践
- linux内核工程导论-网络:tcp拥塞控制——PRR
- 为什么Wireshark无法解密HTTPS数据
- java网络编程:Socket和ServerSocket类
- ubuntu server 无法使用无线网络
- TensorFlow深度学习笔记 循环神经网络实践
- 基于Python3 神经网络的实现
- 基于Python3 神经网络的实现