【问题标题】:Can we send data from an android device to another android device directly (p2p) without server in the middle?我们可以在没有服务器的情况下将数据从安卓设备直接发送到另一个安卓设备(p2p)吗?
【发布时间】:2014-01-26 07:16:42
【问题描述】:

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

P.S : 我知道没有互联网我们无法实现这一点,问题假定两个目标都有互联网连接,gprs/3g/4g 或 wifi 互联网连接!

注意:我希望这在 wifi 和非 wifi 互联网上都可以实现!

【问题讨论】:

    标签: android sockets tcp p2p


    【解决方案1】:

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

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


    Java SDK

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

    以下示例取自here找到的Android 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());
    }
    

    发布

    现在是时候找到我们的声音了。是时候向世界各地订阅频道演示的每个人发送消息了。首先,我们将像在第 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);
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        请检查:

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

          • 这是一个套接字编程概念,我不明白你打算如何用推送通知方法解决它?
          • 没有服务器我不知道。据我所知,最好的情况是你可以开发一个回合服务器。通过turn server,每个设备都可以得到自己的NAT IP地址和端口。然后设备可以与其他设备握手他们的 ip 和端口。
          猜你喜欢
          • 2018-11-18
          • 1970-01-01
          • 2011-10-14
          • 2016-09-17
          • 2015-08-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-03-28
          相关资源
          最近更新 更多