2012-02-29 41 views
2

我真正想做的就是通過wifi廣播一條消息(假設其他單元已經創建了應用程序,但我不知道它的IP),所以應用程序在收到該消息時會返回一個消息與該設備的IP通過WiFi,我想這種情況下的理想情況下,這兩個設備運行相同的應用程序,我創建的只是想添加功能,通過無線廣播一條消息到其他設備,是否有可能或者如何?如何獲取其他移動設備的IP地址?

+1

聽起來像是你想要做的事,如Bonjour服務的iPhone,你檢查出這個問題嗎? http://stackoverflow.com/questions/2474143/how-can-i-discover-zeroconf-bonjour-services-on-android-im-having-trouble-wi – 2012-02-29 19:22:06

回答

3

我用Java創建了這個演示程序。每個主機(Android設備)都將運行客戶端和服務器代碼。客戶端不斷地在多播地址上發佈其IP地址,其中所有其他設備正在監聽並跟蹤它。同一個設備也是同一個多播地址上的一個監聽器,因此他可以在發送數據包時發現其他Android。請注意,此架構在資源使用方面非常繁重,根本無法擴展。我只是寫了這個與數據包玩,它也似乎最接近的回答你的問題

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

public class Main { 

    public static final int PORT = 2345; 
    public static final String MULTICAST = "224.0.0.99"; 

    /* 
    * A simple server that prints the name of the first 
    * device discovered and then terminates 
    */ 
    static class Server extends Thread{ 
     @Override 
     public void run() { 
      try { 
       MulticastSocket socket = new MulticastSocket(PORT); 
       InetAddress group = InetAddress.getByName(MULTICAST); 
       socket.joinGroup(group); 
       byte[] buf = new byte[256]; 

       // receive request 
       DatagramPacket packet = new DatagramPacket(buf, buf.length); 
       socket.receive(packet); 
       System.out.printf("SERVER receives: %s", new String(packet.getData())); 

       socket.leaveGroup(group); 
       socket.close(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    /* 
    * This client send own IP address to all machines 
    * listening on MULTICAST 
    */ 
    static class Client extends Thread{ 
     @Override 
     public void run() { 
      try { 
       MulticastSocket socket = new MulticastSocket(); 
       socket.setBroadcast(true); 
       byte[] buffer = "I'm a new client. My IP is XXX.XXX.XXX.XXX".getBytes(); 
       DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST), PORT); 
       socket.send(packet); 

       socket.close(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

     } 
    } 

    public static void main(String[] args) throws InterruptedException { 
     new Server().start(); 
     Thread.sleep(1000); // Make sure server started 
     new Client().start(); 
    } 

} 

關於Android的部分,你需要許可android.permission.CHANGE_WIFI_MULTICAST_STATE因爲多播包裝是由Android軟件開發包過濾掉了,所以你將使用WifiManager.MulticastLock

WifiManager wm = (WifiManager)getSystemService(Context.WIFI_SERVICE); 
WifiManager.MulticastLock multicastLock = wm.createMulticastLock("mydebuginfo"); 
multicastLock.acquire(); 
1

我幾天前就在想這件事。我的結論是,你不能在設備的IP上進行中繼,因爲它們可以通過DHCP獲取,並且每次都可以更改。所以,一個非常簡單的方法是將附加在電子郵件中的數據發送給接收方。

你必須實現一個解析器,它可以讀取數據(假設它是用XML文件寫的)並在接收器上做你需要的。爲了達到這個目的,你必須註冊正確的組件(Activity)來響應你傳輸文件類型的Intent ACTION_VIEW, XML。

希望它能幫助!

+0

好吧,我應該設計一個地方學院我們擁有的無線網絡(大部分時間)來自分配給連接設備的路由器的靜態IP。我只是想知道如何發送消息,類似的我們在無線上聊天。 – Saqib 2012-02-29 19:51:07

+1

好的!所以你正在一個封閉的環境中工作!這改變了情況。然後,我認爲你應該做一些事情,比如使用TCP數據包,並編寫客戶端/服務器端... – Caumons 2012-03-01 00:10:41