2013-04-04 34 views
8

我正在製作一個Android應用程序,通過手機向我的PC發送UDP多播包。從移動到PC的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

此文件保持常量無線上網的互動記錄。

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

我不知道什麼是錯的,我沒有得到任何輸出。 請幫助。我看了很多教程,並且關注他們說的每一步。

回答

2

這兩個設備應連接到相同的網絡。當你從模擬器發送數據包到PC時,它駐留在同一個系統上。因此,你不會遇到任何問題。但是,當您將數據包從PC發送到移動設備時,這兩個設備應該共享相同的網絡。

如果兩個設備都連接到unfirewalled網絡,它會更有效高效。因爲防火牆可能會在發送數據包時造成麻煩。

這是我上來的結論。