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

arm*_*min 8 sockets android p2p tcp

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

PS:我知道没有互联网我们无法实现这一点,这个问题假设两个目标都有互联网连接,无论是gprs/3g/4g还是wifi连接!

注意:我希望这可以在wifi和非wifi上网!

Ian*_*ngs 7

过去,我在这个案例中使用PubNub取得了成功.我在构建Mote.io时使用了类似的技术.

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


Java SDK

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

以下示例取自此处的Android SDK教程.

SDK截图


订阅

这就是有趣的开始!如果我们想要从频道接收消息,我们需要订阅频道.要做到这一点,我们需要做的就是使用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());
}
Run Code Online (Sandbox Code Playgroud)

发布

现在是时候找到我们的声音.是时候向世界各地的每个人发送消息了订阅频道演示.首先,我们将按照我们在步骤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);
Run Code Online (Sandbox Code Playgroud)