Java 从手机到PC的UDP多播
我正在制作一个Android应用程序,将UDP多播数据包从手机发送到我的电脑 这是我的移动应用程序的代码: 这是Java 从手机到PC的UDP多播,java,android,sockets,wifi,android-wifi,Java,Android,Sockets,Wifi,Android Wifi,我正在制作一个Android应用程序,将UDP多播数据包从手机发送到我的电脑 这是我的移动应用程序的代码: 这是AndroidManifest.xml <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" /> <uses-permission android:name="android.permission.INTERNET"/> <uses-permissio
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"/>
此文件发送多播数据包:
MultiCastThread.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;
}
}
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());
}
}
}
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);
}
}
}
WifiConstants.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;
}
}
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());
}
}
}
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);
}
}
}
此文件保存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
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;
}
}
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());
}
}
}
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发送到移动设备时,两台设备应共享同一网络 如果连接到
网络的两个设备都未重新调用
网络,则效率将更高。因为防火墙可能会在发送数据包时造成麻烦
这就是我得出的结论