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:

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

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

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

时间: 2024-09-05 14:55:20

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

Android——发送和接收广播

一,发送广播   利用Intent来发送广播. 使用:在需要发送广播的地方创建一个Intent对象,将信息的内容和用于过滤的信息封装起来,通过以下三种方法将Intent广播出去: 1,Context.sendBroadcast 2,Context.sendOrderedBroadCast 3,Context.sendStickyBroadcast   三种方法的区别: 1,sendBroadcast和sendStickyBroadcast发送出去的Intent,对于所有满足条件的Broadcas

Linux系统下UDP发送和接收广播消息小例子

[cpp] view plaincopy   // 发送端   #include <iostream>   #include <stdio.h>   #include <sys/socket.h>   #include <unistd.h>   #include <sys/types.h>   #include <netdb.h>   #include <netinet/in.h>   #include <arpa/

如何用java发送post请求,重要的是将textarea中的内容也发送过去?请教高手!

问题描述 我要通过一个网站的服务获取一些信息,但是这个网站每次只能处理我提交的一条序列,希望通过发送post请求处理批量的序列,该网站网址为:http://bioinf.cs.ucl.ac.uk/psipred/

跨应用发送和接受广播

跨应用发送和接收广播,与同应用下的情况差不多,只需要添加一个权限,以及配置一下receiver的android:process属性即可     发送广播的应用中:   Java代码   Intent intent = new Intent("info.zhegui.receiver.interprocess");   sendBroadcast(intent);    注意要在manifest.xml添加接收广播的权限,这个权限是receiver自定义的 Java代码   <us

Java使用JavaMail API发送和接收邮件的代码示例_java

使用Javamail发送邮件,必需的jar包(请下载javamail的源文件,官方下载页:http://www.oracle.com/technetwork/java/javamail/index-138643.html): mailapi.jar.定义了收发邮件所使用到的接口API: smtp.jar.包含了发送邮件使用到的类: pop3.jar.包含了收邮件使用到的类: 我们通常发送邮件使用的协议是smtp协议,接受邮件使用的协议是pop3协议.或者,我们直接将mail.jar加入到工程,这

Java小例子:通过Socket发送和接收文件

这是一个简单的包含发送端和接收端的例子.发送端向接收端发送文件名和文件内容 ,接收端将收到的文件保存在磁盘上.接收端可以同时接收多个发送端传来的文件,但没 有处理文件同名的情况. 这个例子中设计了一个简单的协议.发送的内容是这样的: 文件名长度(4字节)-文件名-文件内容长度(4字节)-文件内容 . 接收端也按照这个结构进行解析.建议先看 Client 类,再看 Server 类. 01.import java.io.*; 02.import java.net.ServerSocket; 03.

彩信发送-java发送彩信,调用电信彩信接口;可苹果手机接收的彩信内容是混乱的

问题描述 java发送彩信,调用电信彩信接口:可苹果手机接收的彩信内容是混乱的 java发送彩信,调用电信彩信接口:可苹果手机接收的彩信内容是混乱的,安卓手机接收正常.面对这种问题,我已经研究了两个星期:至今都没有解决:求各位高手指点一二.谢谢!

java发送HttpClient请求及接收请求结果过程的简单实例_java

一. 1.写一个HttpRequestUtils工具类,包括post请求和get请求 package com.brainlong.framework.util.httpclient; import net.sf.json.JSONObject; import org.apache.commons.httpclient.HttpStatus; import org.apache.http.HttpResponse; import org.apache.http.client.methods.Htt

Java Socket通信(一)之客户端程序 发送和接收数据_java

网络应用分为客户端和服务端两部分,而Socket类是负责处理客户端通信的Java类.通过这个类可以连接到指定IP或域名的服务器上,并且可以和服务器互相发送和接受数据. 对于Socket通信简述,服务端往Socket的输出流里面写东西,客户端就可以通过Socket的输入流读取对应的内容.Socket与Socket之间是双向连通的,所以客户端也可以往对应的Socket输出流里面写东西,然后服务端对应的Socket的输入流就可以读出对应的内容. 例1:客户端的简略写法(一). Socket clien