博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java发送和接收广播的UDP,用于探测局域网中指定类型的设备
阅读量:7040 次
发布时间:2019-06-28

本文共 3388 字,大约阅读时间需要 11 分钟。

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

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:

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

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

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

转载地址:http://mxaal.baihongyu.com/

你可能感兴趣的文章
ElasticSearch DSL Script使用案例分享
查看>>
你真的懂JavaScript计时器吗?
查看>>
CI框架如何在主目录application目录之外使用uploadify上传插件和bootstrap前端框架:...
查看>>
游乌镇
查看>>
使用Akka持久化——持久化与快照
查看>>
springboot之RMI的使用
查看>>
【NLP】揭秘马尔可夫模型神秘面纱系列文章(三)
查看>>
openstack 云服务上创建的虚拟机,主机名修改
查看>>
css3 贝塞尔曲线cubic-bezier(x1, y1, x2, y2)
查看>>
远程连接docker daemon,Docker Remote API
查看>>
C语言dll文件的说明以及生成、使用方法
查看>>
【Web API系列教程】1.3 — 实战:用ASP.NET Web API和Angular.js创建单页面应用程序(上)...
查看>>
java基础学习_面向对象(上)03_day08总结
查看>>
NG-ZORRO 7.3.1 发布,Ant Design 的 Angular 实现
查看>>
20180417PLSQL中sql语句格式化与注解问题
查看>>
Java 基础 之 while 循环
查看>>
顺丰今天上市了,王卫又成了民营快递业的首富
查看>>
前端和云端性能分析工具分析报告
查看>>
Jim Zemlin:加速开源创新,Linux 基金会超越 Linux
查看>>
.NET零基础入门05:委托与事件
查看>>