我们能否在没有服务器中间介入的情况下直接(点对点)从一个安卓设备发送数据到另一个安卓设备?

11

我需要在两个Android设备之间直接发送数据(p2p),在它们通过服务器找到彼此之后。我读到一些资料说这是不可能的,但我不明白为什么一个可以访问互联网的设备(它有IP地址对吧?)不能创建点对点连接?如果这不可能,为什么?如果这是可能的,怎么做?

P.S.:我知道没有互联网我们无法实现这一目标,问题假设两个目标都有互联网连接,无论是GPRS/3G/4G还是WiFi互联网连接!

注意:我希望这在WiFi和非WiFi互联网上都能实现!

4个回答

8

我以前使用PubNub在这种情况下取得了成功。在构建Mote.io时,我使用了类似的技术。

我一直认为手机不能轻松地进行点对点连接很蠢,但是您可以通过第三方模拟这种通信。使用像PubNub这样的托管服务的好处是,它适用于WiFi和蜂窝网络,并且能够处理不良或掉线的连接。


Java SDK

您可以使用PubNub Android SDK在 PubNub 网络上订阅并发布通道。所有网络都已处理好,您只需要关心通道和消息即可。

以下示例来自此处的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());
}

发布

现在是时候找到我们的声音了。我们需要给订阅频道"demo"的全世界的人们发送一条信息。首先,我们将像第3步一样订阅,只不过这次我们将指定频道为"demo"。一旦我们订阅了该频道,我们所需做的就是使用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
你不需要互联网,可以在本地局域网上进行操作,传输数据需要两个安卓设备连接到同一局域网。然后,在一个设备上创建服务器套接字,在另一个设备上创建客户端套接字。这样两个设备就可以相互通信了。你只需要有一个 WiFi 路由器来创建局域网即可。

0

-1
你必须使用推送通知方法。没有网络是无法实现的。

这是一个套接字编程的概念,我不明白你打算如何使用推送通知方法来解决它? - armin
没有服务器我就不知道怎么办了。从我的知识来看,你可以开发一个转接服务器来实现最佳方案。通过转接服务器,每个设备都可以获取其NAT IP地址和端口。然后设备可以用它们的IP和端口与其他设备握手。 - java seeker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接