2012-02-29 168 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