从移动到PC的UDP多播

我正在制作一个Android应用程序,通过手机将UDP多播包发送到我的电脑。

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

这是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交互常数的logging。

 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); } } } 

我不知道什么是错的,我没有得到任何输出。 请帮忙。 我看了很多教程,并且跟着他们说的每一步。

Solutions Collecting From Web of "从移动到PC的UDP多播"

这两个设备应该连接到同一个networking 。 当你从模拟器发送数据包到PC时,它驻留在同一个系统上。 所以,你没有面对任何问题。 但是,当你将数据包从PC发送到移动设备时,两个设备应该共享同一个networking。

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

这是我上来的结论。