java - 从移动设备到 PC 的 UDP 多播

标签 java android sockets wifi android-wifi

我正在制作一个 Android 应用程序,用于将 UDP 多播数据包从手机发送到我的 PC。

这是我的移动应用程序的代码:

这是AndroidManifest.xml中的用户权限

<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

DeviceManagerWindow.java

import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.view.Menu;

public class DeviceManagerWindow extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_device_manager_window);
        WifiManager wifi = (WifiManager)getSystemService( Context.WIFI_SERVICE );
        if(wifi != null)
        {
            WifiManager.MulticastLock lock = wifi.createMulticastLock("WifiDevices");
            lock.acquire();
        }
        Thread sendMulticast = new Thread(new MultiCastThread());
        sendMulticast.start();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.device_manager_window, menu);
        return true;
    }

}

这个文件发送多播数据包:

MultiCastThread.java

public class MultiCastThread implements Runnable
{
    MulticastSocket s;
    DatagramPacket pack;
    public MultiCastThread()
    {
        try
        {
            s = new MulticastSocket(WifiConstants.PORT_NO);
            s.joinGroup(InetAddress.getByName(WifiConstants.GROUP_ADDR));
        }
        catch(Exception e)
        {
            Log.v("Socket Error: ",e.getMessage());
        }
    }
    @Override
    public void run()
    {
        try
        {
            pack = new DatagramPacket(WifiConstants.WHO_IS.getBytes(),WifiConstants.WHO_IS.getBytes().length, InetAddress.getByName(WifiConstants.GROUP_ADDR), WifiConstants.PORT_NO);
            s.setTimeToLive(WifiConstants.TIME_TO_LIVE);
            s.send(pack);
        }
        catch(Exception e)
        {
            Log.v("Packet Sending Error: ",e.getMessage());
        }
    }
}

WifiConstants.java

此文件记录了 Wifi 交互的常量。

public class WifiConstants
{
    public static final int PORT_NO = 5432;
    public static final String GROUP_ADDR = "225.4.5.6";
    public static final int DGRAM_LEN = 1024;
    public static final String WHO_IS = "Who is?";
    public static final int TIME_TO_LIVE = 1;
}

在我的系统上,我正在运行一个 java 代码来接收数据包并将其打印在控制台中。

ListenerDevice.java

package Receiver;

import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;


public class ListenerDevice
{
    public static final int PORT_NO = 5432;
    public static final String GROUP_ADDR = "225.4.5.6";
    public static final int DGRAM_LEN = 1024;
    public static final String WHO_IS = "Who is?";
    public static final int TIME_TO_LIVE = 1;
    public static void main(String[] args)
    {
        MulticastSocket socket = null;
        DatagramPacket inPacket = null;
        byte[] inBuf = new byte[DGRAM_LEN];
        try
        {
          //Prepare to join multicast group
          socket = new MulticastSocket(PORT_NO);
          InetAddress address = InetAddress.getByName(GROUP_ADDR);
          socket.joinGroup(address);

              while(true)
              {
                    System.out.println("Listening");
                    inPacket = new DatagramPacket(inBuf, inBuf.length);
                    socket.receive(inPacket);
                    String msg = new String(inBuf, 0, inPacket.getLength());
                    System.out.println("From :" + inPacket.getAddress() + " Msg : " + msg);
              }
        }
        catch(Exception ioe)
        {
            System.out.println(ioe);
        }
      }
}

我不知道出了什么问题,我没有得到任何输出。 请帮忙。 我看了很多教程,并按照他们所说的每一步进行操作。

最佳答案

两个设备都应该连接到同一个网络。当您将数据包从模拟器发送到 PC 时,它驻留在同一系统上。因此,您不会遇到任何问题。但是当您将数据包从 PC 发送到移动设备时,两个设备应该共享同一个网络。

如果两个设备都连接到没有防火墙 的网络,将会更高效。因为防火墙可能会在发送数据包时造成麻烦。

这是我得出的结论。

关于java - 从移动设备到 PC 的 UDP 多播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15807733/

相关文章:

java - 使用 Java 的 Selenium - 无法在 Google 搜索页面上找到 Webelements

java - 使用显示标签 1.1.1 将数据导出到 Excel 时出错

java - 查明 BufferedImage 是否被点击

C#:如何在 Socket.BeginReceive 回调之前终止套接字?

ios - 是否可以将 Socket.io 与 AWS Lambda 一起使用?

python - 如何检查是否有互联网连接

java - 尝试更改两个公共(public) int 值,但返回时未被更改

android - 选择 Android GPS 定位中使用的卫星

android - 如何在应用程序加载一定时间后加载 Admob 广告?

android - Ionic2 Native - 相机 - 从 Android 上的给定 URI 获取真实路径