我们可以直接将数据从Android设备发送到另一个Android设备(p2p)而不需要中间的服务器吗?

时间:2014-01-26 07:16:43

标签: android sockets tcp p2p

我需要通过服务器将数据从一个Android设备直接发送到另一个Android设备(p2p)。 我读了一些不能做的事情,但我不明白为什么可以访问互联网的设备(它有一个IP权利?)无法创建点对点连接? 如果这不可能,为什么?如果是这样的话?

P.S:我知道没有互联网我们无法做到这一点,这个问题假定两个目标都有互联网连接,无论是gprs / 3g / 4g还是无线互联网连接!

注意:我希望在wifi和非wifi上网都能实现这一点!

4 个答案:

答案 0 :(得分:7)

过去我使用PubNub成功完成了这个案例。我在构建Mote.io时使用了类似的技巧。

我一直认为手机无法轻松实现点对点连接是愚蠢的,但你可以模仿这种与中间第三方的通信。使用像PubNub这样的托管服务的优势在于它可以在Wifi和蜂窝网络上运行,并且能够处理不良或丢弃的连接。


Java SDK

您可以使用PubNub Android SDK for android订阅并发布到PubNub网络上的频道。所有的网络都得到了照顾,您唯一关注的是渠道和信息。

以下示例来自找到here的Android SDK教程。

SDK Screenshot


订阅

这是有趣的开始!如果我们想要从频道接收消息,我们需要订阅频道。要做到这一点,我们需要做的就是使用subscribe()方法并提供一个通道名称。我们将使用hello_world作为频道名称。

我们还需要定义一个回调对象,该对象将作为参数传递给subscribe()方法。来自回调对象的方法将在消息接收,错误,连接,断开连接,重新连接等事件上调用:

try {
  pubnub.subscribe("hello_world", new Callback() {

      @Override
      public void connectCallback(String channel, Object message) {
          Log.d("PUBNUB","SUBSCRIBE : CONNECT on channel:" + channel
                     + " : " + message.getClass() + " : "
                     + message.toString());
      }

      @Override
      public void disconnectCallback(String channel, Object message) {
          Log.d("PUBNUB","SUBSCRIBE : DISCONNECT on channel:" + channel
                     + " : " + message.getClass() + " : "
                     + message.toString());
      }

      public void reconnectCallback(String channel, Object message) {
          Log.d("PUBNUB","SUBSCRIBE : RECONNECT on channel:" + channel
                     + " : " + message.getClass() + " : "
                     + message.toString());
      }

      @Override
      public void successCallback(String channel, Object message) {
          Log.d("PUBNUB","SUBSCRIBE : " + channel + " : "
                     + message.getClass() + " : " + message.toString());
      }

      @Override
      public void errorCallback(String channel, PubnubError error) {
          Log.d("PUBNUB","SUBSCRIBE : ERROR on channel " + channel
                     + " : " + error.toString());
      }
    }
  );
} catch (PubnubException e) {
  Log.d("PUBNUB",e.toString());
}

发布

现在是时候找到我们的声音了。是时候向全世界的每个人发送消息了订阅频道演示。首先,我们将按照我们在步骤3中所做的订阅,这次我们将通道指定为演示。一旦我们订阅了频道,我们需要做的就是使用publish()方法。我们将指定频道名称,即我们要发送的消息。我们还将包含一个回调对象。

Callback callback = new Callback() {
  public void successCallback(String channel, Object response) {
    Log.d("PUBNUB",response.toString());
  }
  public void errorCallback(String channel, PubnubError error) {
  Log.d("PUBNUB",error.toString());
  }
};
pubnub.publish("demo", "Hello World !!" , callback);

答案 1 :(得分:1)

你不需要互联网你可以在局域网上做,在两个Android设备之间传输数据,设备必须连接到同一个局域网,然后在一个设备上你必须创建服务器套接字和其他设备你必须创建一个客户端套接字。这样两个设备可以相互通信你只需要一个wifi路由器来创建一个局域网。

答案 2 :(得分:0)

android NSD API旨在完成你想要实现的完全相同的事情!与SDK捆绑在一起的示例是不言自明的!

请检查:

[Android NSD API示例](http://developer.android.com/training/connect-devices-wirelessly/nsd.html)和[此处](Android - communicating between two devices

答案 3 :(得分:-1)

  

您必须使用推送通知方法。没有互联网你就无法实现它。