网站首页 > java教程 正文
SADP工具很容易扫描到海康的IP相机,如下图所示
那么Java该怎么实现了,用wireshark抓包,发现是SSDP协议
1. 引言
在现代网络中,设备之间的自动发现和通信是至关重要的。SSDP(Simple Service Discovery Protocol)是一种用于在本地网络中发现和公布设备及服务的协议。本文将详细介绍SSDP的概念、工作原理、协议解析以及其在客户端和服务端的伪代码实现。同时,还将讨论相关的计算机网络概念,如组播和单播。
2. SSDP介绍、应用与优缺点及单播组播概念
2.1 SSDP概念
SSDP是UPnP(Universal Plug and Play)协议栈的一部分,旨在使网络设备和服务能够自动发现和互操作。它利用HTTPU(HTTP over UDP)进行通信,允许设备在本地网络中相互发现并交换信息。
2.2 SSDP的应用
智能家居设备:如智能电视、灯光控制、安防系统等。
网络打印机:自动发现并连接到网络打印机。
媒体服务器:发现和连接到家庭媒体服务器进行内容流传输。
2.3 SSDP的优缺点
优点
自动化:设备可以自动发现和配置,无需人工干预。
简单性:协议简单,易于实现和使用。
缺点
安全性:由于使用UDP广播,可能会导致未经授权的设备发现和连接。
网络负载:大量设备同时发送SSDP消息可能会增加网络负载。
2.4 单播和组播概念
单播
单播(Unicast)是一种一对一的通信方式,数据包从单个发送者传输到单个接收者。单播是最常见的网络通信方式,用于大多数的互联网应用,如网页浏览、电子邮件等。
单播的优点
简单性:实现和管理相对简单,网络设备普遍支持。
可靠性:点对点传输,易于控制和监视。
单播的缺点
效率低:在需要同时传输给多个接收者时,效率较低,因为每个接收者都需要单独传输。
组播
组播(Multicast)是一种网络通信方式,允许信息被同时发送到一组指定的接收者,而不是单个接收者或广播给所有接收者。组播在IP网络中通过组播地址进行标识,典型应用包括视频会议、网络电视和在线游戏。
组播的优点
高效性:数据包只在需要的网络路径上传输,节省带宽。
可扩展性:适用于大规模的多点传输,如视频流。
组播的缺点
复杂性:组播路由的实现和管理较为复杂。
设备支持:需要网络设备支持组播协议,如IGMP(Internet Group Management Protocol)。
那么我们可以通过UDP发送组播消息即可
package org.example;
import java.net.*;
import java.util.UUID;
//TIP 要<b>运行</b>代码,请按 <shortcut actionId="Run"/> 或
// 点击装订区域中的 <icon src="AllIcons.Actions.Execute"/> 图标。
public class Main
{
public static void main(String[] args) throws Exception
{
String host = "239.255.255.250";//广播地址
int port = 37020;//广播的目的端口
String uuid = UUID.randomUUID().toString().replace("-", "");
String uUIdMessage= String.format("<?xml version=\"1.0\" encoding=\"utf-8\"?><Probe><Uuid>%s</Uuid><Types>inquiry</Types></Probe>", uuid);
// String message = "M-SEARCH * HTTP/1.1\n" +
// "HOST: 239.255.255.250:1900\n" +
// "MAN: \"ssdp:discover\"\n" +
// "MX: 1\n" +
// "ST: urn:dial-multiscreen-org:service:dial:1\n" +
// "USER-AGENT: Microsoft Edge/128.0.2739.42 Windows\n";//用于发送的字符串
try{
InetAddress adds = InetAddress.getByName(host);
DatagramSocket socket = new DatagramSocket();
DatagramPacket dp = new DatagramPacket(uUIdMessage.getBytes(), uUIdMessage.length(), adds, port);
socket.send(dp);
// DatagramPacket dp = new DatagramPacket(message.getBytes(), message.length(), adds, port);
// socket.send(dp);
// ds.close();
// 1.创建一个接受端对象,注册端口
MulticastSocket multicastSocket = new MulticastSocket(37020);
multicastSocket.joinGroup(new InetSocketAddress(InetAddress.getByName(host),37020), NetworkInterface.getByInetAddress(InetAddress.getLocalHost()));
while (true)
{
//把当前接收端加入到一个组播中,绑定对应的组播消息IP
// socket.joinGroup(InetAddress.getByName("224.0.1.1"));
//新绑定方法
// 2.创建一个数据包对象,封装接受的数据
byte[] buffer=new byte[1024*64];
DatagramPacket packet=new DatagramPacket(buffer,buffer.length);
//3.等待接收消息
socket.receive(packet);
//4.打印接收的内容
int len=packet.getLength();
String rs=new String(buffer,0,len);
System.out.println("收到了IP为:"+packet.getAddress()+"\n端口为:"+packet.getPort()+" 的消息");
System.out.println("消息内容:"+rs);
}
}
catch (Exception e) {
e.printStackTrace();
}
// 确定要监听的广播组和端口
}
}
wireshark已经获取到了海康相机返回的包
idea中执行结果为
猜你喜欢
- 2024-12-26 大厂必问 · 如何防止订单重复? 如何保证订单不会重复提交
- 2024-12-26 系列:第八篇—AppKey和AppSecret生成策略
- 2024-12-26 RabbitMQ镜像队列集群搭建、与SpringBoot整合
- 2024-12-26 Redisson 加锁、锁自动续期、解锁源码分析
- 2024-12-26 Java Web轻松学62 - 实现用户登录功能
- 2024-12-26 领导不让用UUID作为MySQL主键,那我用啥?
- 2024-12-26 Spring Boot中利用多线程技术实现数据的批量处理?
- 2024-12-26 SpringBoot中如何实现对上传文件病毒扫描?
- 2024-12-26 springBoot + mysql + redis实现扫码登录
- 2024-12-26 牛逼!自己动手从0实现一个分布式RPC框架,成功拿下阿里offer
你 发表评论:
欢迎- 04-26Java高效处理大文件读写的全方位指南
- 04-26省钱兄JAVA视频交系统开发
- 04-26Java常用工具类技术文档
- 04-26高效使用Java构建工具,Maven篇|云效工程师指北
- 04-26Java中自定义配置文件可以如此简单
- 04-26Java 技术文档(详细版)
- 04-26DuckDuckGo应用和扩展全面禁止谷歌的单点登录弹窗
- 04-26单点登录的终级解决方案-xxlSso
- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)