如何在两个设备(安卓、iPhone)之间传输“数据”?

13

我该如何在两台设备之间传输数据?我希望能在不同的平台(安卓、iPhone)之间传输数据(主要是图片文件)。应该使用点对点传输还是客户端-服务器传输呢?

非常感谢任何帮助。


Android2Android是可能的,可以查看BTchat演示。但是iPhone上的蓝牙并不设计用于此用途。 - Its not blank
你想通过什么机制进行这样的传输?蓝牙、WiFi、互联网 - 以上任何一种? - halfer
我想通过3G或wifi在互联网上传输数据。 - Parvin Gasimzade
如果您在问题中标记了跨平台,那么您是在使用像PhoneGap或任何混合应用程序开发iOS和Android吗?所以您想要在这些混合移动应用程序之间传输文件 - 如果我错了,请纠正我? - Futur
文件从发送方发送到服务器,然后从服务器传输回接收方。 - Futur
显示剩余2条评论
5个回答

12

你看过高通的AllJoyn库吗?它只能通过蓝牙或wifi工作。

下面的代码是从将Socket编程纳入你的应用程序中复制的。

public class ServerActivity extends Activity {

    private TextView serverStatus;

    // default ip
    public static String SERVERIP = "10.0.2.15";

    // designate a port
    public static final int SERVERPORT = 8080;

    private Handler handler = new Handler();

    private ServerSocket serverSocket;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.server);
        serverStatus = (TextView) findViewById(R.id.server_status);

        SERVERIP = getLocalIpAddress();

        Thread fst = new Thread(new ServerThread());
        fst.start();
    }

    public class ServerThread implements Runnable {

        public void run() {
            try {
                if (SERVERIP != null) {
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            serverStatus.setText("Listening on IP: " + SERVERIP);
                        }
                    });
                    serverSocket = new ServerSocket(SERVERPORT);
                    while (true) {
                        // listen for incoming clients
                        Socket client = serverSocket.accept();
                        handler.post(new Runnable() {
                            @Override
                            public void run() {
                                serverStatus.setText("Connected.");
                            }
                        });

                        try {
                            BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
                            String line = null;
                            while ((line = in.readLine()) != null) {
                                Log.d("ServerActivity", line);
                                handler.post(new Runnable() {
                                    @Override
                                    public void run() {
                                        // do whatever you want to the front end
                                        // this is where you can be creative
                                    }
                                });
                            }
                            break;
                        } catch (Exception e) {
                            handler.post(new Runnable() {
                                @Override
                                public void run() {
                                    serverStatus.setText("Oops. Connection interrupted. Please reconnect your phones.");
                                }
                            });
                            e.printStackTrace();
                        }
                    }
                } else {
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            serverStatus.setText("Couldn't detect internet connection.");
                        }
                    });
                }
            } catch (Exception e) {
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        serverStatus.setText("Error");
                    }
                });
                e.printStackTrace();
            }
        }
    }

    // gets the ip address of your phone's network
    private String getLocalIpAddress() {
        try {
            for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
                NetworkInterface intf = en.nextElement();
                for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
                    InetAddress inetAddress = enumIpAddr.nextElement();
                    if (!inetAddress.isLoopbackAddress()) { return inetAddress.getHostAddress().toString(); }
                }
            }
        } catch (SocketException ex) {
            Log.e("ServerActivity", ex.toString());
        }
        return null;
    }

    @Override
    protected void onStop() {
        super.onStop();
        try {
             // make sure you close the socket upon exiting
             serverSocket.close();
         } catch (IOException e) {
             e.printStackTrace();
         }
    }

}

该页面已不存在。 - Rohit Mandiwal

6
如果您对 Bump 没有意见,那么他们为开发人员提供了一个API,并且非常容易使用。看看这个。YouTube 上查看在iOS和Android之间传输的实时演示。
Github 中查看详细的代码片段和示例。
PS:我不属于 bu.mp :).

谢谢你的回答。我知道Bump,但我不想使用它。我正在尝试弄清楚它是如何工作的。 - Parvin Gasimzade
" Bump已经不存在了。" - Rohit Mandiwal

5

虽然在某些情况下,P2P是可能的,但采用客户端-服务器架构可以实现最广泛的兼容性,代价是需要部署、供电、连接和维护服务器。

  • 您可以使用无线接入点和移动网络(3G等)
  • 系统中有一个准备好的位置来测量(或限制)使用情况和/或插入广告
  • 您不必担心防火墙阻止设备的入站连接(在wifi上很常见,在移动设备上几乎总是如此)
  • 设备的相对位置无关紧要
  • 您不仅可以与智能手机和平板电脑互操作,还可以与传统PC和笔记本电脑互操作

P2P和客户端-服务器的性能如何?哪一个性能更好? - Parvin Gasimzade
1
如果其中一种想法在需要它的情况下无法工作,那么性能为零。如果两种想法都可以工作,您可以同时支持它们。 - Chris Stratton

2
我会使用Web服务。这样做可以更轻松地维护您的服务,因为服务实现独立于您的应用程序。
Web服务的优点:
- 可在预配置的DNS下访问 - 对服务进行修改不会影响应用程序(无需更新可能的错误修复)
Web服务的缺点:
- 所有流量都通过您的服务器传输 - 应用程序依赖于您的服务器
然后您应该问自己一个问题,您的通信中传输了多少数据?使用直接连接是否真正有益?

0

您可以使用filehub在IOS和Android之间传输文件。

市场上有一种新设备叫做filehub,可以在iOS和Android设备之间传输照片/电影/音乐,或者在移动设备和SD卡/USB硬盘之间传输。我认为它被称为ravpower filehub。


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