Java发送和接收广播的UDP,用于探测局域网中指定类型的设备

简介:

注意这是发的广播信息,同一网段中其它机器都会收到这个信息(只有特殊的监听这类消息的机器会做出回应):

SendUDP.java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import  java.io.BufferedReader;
import  java.io.IOException;
import  java.io.InputStreamReader;
import  java.net.DatagramPacket;
import  java.net.DatagramSocket;
import  java.net.InetAddress;
import  java.net.UnknownHostException;
 
public  class  SendUDP {
     public  static  void  main(String[] args)  throws  Exception {
         // Use this port to send broadcast packet
         @SuppressWarnings ( "resource" )
         final  DatagramSocket detectSocket =  new  DatagramSocket( 8888 );
 
         // Send packet thread
         new  Thread( new  Runnable() {
             @Override
             public  void  run() {
                 System.out.println( "Send thread started." );
                 while  ( true ) {
                     try  {
                         byte [] buf =  new  byte [ 1024 ];
                         int  packetPort =  9999 ;
 
                         // Broadcast address
                         InetAddress hostAddress = InetAddress.getByName( "192.168.184.255" );
                         BufferedReader stdin =  new  BufferedReader(
                                 new  InputStreamReader(System.in));
                         String outMessage = stdin.readLine();
 
                         if  (outMessage.equals( "bye" ))
                             break ;
                         buf = outMessage.getBytes();
                         System.out.println( "Send "  + outMessage +  " to "  + hostAddress);
                         // Send packet to hostAddress:9999, server that listen
                         // 9999 would reply this packet
                         DatagramPacket out =  new  DatagramPacket(buf,
                                 buf.length, hostAddress, packetPort);
                         detectSocket.send(out);
                     catch  (UnknownHostException e) {
                         e.printStackTrace();
                     catch  (IOException e) {
                         e.printStackTrace();
                     }
                 }
             }
         }).start();
         
         // Receive packet thread.
         new  Thread( new  Runnable() {
             @Override
             public  void  run() {
                 System.out.println( "Receive thread started." );
                 while ( true ) {
                     byte [] buf =  new  byte [ 1024 ];
                     DatagramPacket packet =  new  DatagramPacket(buf, buf.length);
                     try  {
                         detectSocket.receive(packet);
                     catch  (IOException e) {
                         e.printStackTrace();
                     }
                     String rcvd =  "Received from "  + packet.getSocketAddress() +  ", Data="
                             new  String(packet.getData(),  0 , packet.getLength());
                     System.out.println(rcvd);
                 }
             }
         }).start();
     }
}


ReceiveUDP.java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import  java.net.DatagramPacket;
import  java.net.DatagramSocket;
 
public  class  ReceiveUDP {
     public  static  void  main(String[] args)  throws  Exception {
         int  listenPort =  9999 ;
         byte [] buf =  new  byte [ 1024 ];
         DatagramPacket packet =  new  DatagramPacket(buf, buf.length);
         @SuppressWarnings ( "resource" )
         DatagramSocket responseSocket =  new  DatagramSocket(listenPort);
         System.out.println( "Server started, Listen port: "  + listenPort);
         while  ( true ) {
             responseSocket.receive(packet);
             String rcvd =  "Received "
                     new  String(packet.getData(),  0 , packet.getLength())
                     " from address: "  + packet.getSocketAddress();
             System.out.println(rcvd);
 
             // Send a response packet to sender
             String backData =  "DCBA" ;
             byte [] data = backData.getBytes();
             System.out.println( "Send "  + backData +  " to "  + packet.getSocketAddress());
             DatagramPacket backPacket =  new  DatagramPacket(data,  0 ,
                     data.length, packet.getSocketAddress());
             responseSocket.send(backPacket);
         }
     }
}

下图是SendUDP端的执行截图,发送内容为Message:

125104_bllV_1434710.png

在SendUDP端发送了消息后,UDP端会立即显示收到消息,如下图:

125123_IWYr_1434710.png

正如第一幅图看到的,我在同一子网下的两台机器上运行着ReceiveUDP,于是两台机器都做出了回应。


如果将这种方式移植到Android手机上,可以用来探测同一WiFi下的其它设备(前提是这些设备上运行着类似ReceiveUDP的),以获取它们的IP地址。此后可以建立TCP连接,做其他的事情。有人说可以用Ping网段的方式来发现其它设备,但对于Android来说,这个方式并不可靠。因为判定消息不可达的时间难以确定。

目录
相关文章
|
4天前
|
监控 Java 调度
Java面试题:描述Java线程池的概念、用途及常见的线程池类型。介绍一下Java中的线程池有哪些优缺点
Java面试题:描述Java线程池的概念、用途及常见的线程池类型。介绍一下Java中的线程池有哪些优缺点
18 1
|
21天前
|
Java 数据处理 Apache
探讨Java中判断String类型为空和null的方法
探讨Java中判断String类型为空和null的方法
14 1
|
10天前
|
存储 Java
Redis08命令-Hash类型,也叫散列,其中value是一个无序字典,类似于java的HashMap结构,Hash结构可以将对象中的每个字段独立存储,可以针对每字段做CRUD
Redis08命令-Hash类型,也叫散列,其中value是一个无序字典,类似于java的HashMap结构,Hash结构可以将对象中的每个字段独立存储,可以针对每字段做CRUD
|
14天前
|
Java 程序员 API
Java异常类型及异常处理方式
Java异常类型及异常处理方式
|
17天前
|
存储 安全 Java
JAVA泛型:类型安全,从编译时开始!
【6月更文挑战第28天】Java泛型是JDK 5引入的特性,用于在编译时实现类型安全的集合。它通过类型参数增强代码灵活性和重用性,减少错误。示例展示了泛型列表`List<Integer>`和`List<String>`如何确保元素类型正确,防止编译时类型不符。泛型提升了代码的类型安全、可读性和维护性。
|
17天前
|
安全 Java 编译器
JAVA泛型,编译时类型安全的“秘密武器”
【6月更文挑战第28天】Java泛型是JDK 5引入的特性,用于在编译时增强类型安全和代码复用。它允许类、接口和方法使用类型参数,确保运行时类型匹配,减少了类型转换错误。例如,泛型方法`<T> void printArray(T[] array)`能接受任何类型数组,编译器会检查类型一致性。此外,泛型提升了代码的可读性、可维护性和与容器类的配合效率,优化整体软件质量。
|
17天前
|
安全 Java 开发者
谁说 JAVA 不懂爱?泛型来给你满满的类型安全感!
【6月更文挑战第28天】Java泛型,编程中的类型守护者,提供编译期类型检查,增强代码安全与可读。如`GenericBox<T>`示例,实现类型参数化,避免转换错误。泛型方法如`printArray<T>`,灵活处理不同数据。它简化代码,消除潜在错误,赋予开发者类型保障的爱,让编程之旅更安心。Java的泛型,是对其语言之爱的深刻表达。
|
21天前
|
存储 Java 程序员
在Java中,变量和类型
在Java中,变量和类型
11 0
|
24天前
|
存储 Java 关系型数据库
数据类型的取值范围以及Java和Mysql数据库的类型对照--强调时间类型的转换(jdk1.8)
数据类型的取值范围以及Java和Mysql数据库的类型对照--强调时间类型的转换(jdk1.8)
20 0
|
24天前
用UDP协议实现发送接收的网络聊天室
用UDP协议实现发送接收的网络聊天室
17 0