11

2 つのデバイス間でデータを転送するにはどうすればよいですか? 異なるプラットフォーム (Android、iPhone) 間でデータ (主に画像ファイル) を転送したいと考えています。p2p を使用することは可能ですか、それともクライアント サーバーを使用する必要がありますか?

どんな助けでも大歓迎です。

4

5 に答える 5

13

Qualcomm の AllJoyn ライブラリを見たことがありますか? Bluetooth または Wi-Fi 経由でのみ動作します。

以下のコードは、このIncorporating Socket Programming into your Applicationsからコピーされたものです。

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();
         }
    }

}
于 2012-05-05T04:18:57.327 に答える
6

Bumpに問題がなければ、開発者が使用できる API が提供され、非常に簡単に使用できます。これをチェックしてください。

iOS と Android 間の転送のライブ デモを見るには @ youtube .

Githubの詳細なコード スニペットと例。

PS: 私は bu.mp に属していません :)。

于 2012-05-07T06:58:44.707 に答える
5

場合によっては p2p が可能ですが、クライアント サーバー アーキテクチャとの最も広範な互換性を実現できますが、サーバーの展開、電源供給、接続、および保守が必要になります。

  • Wi-Fi アクセス ポイントとモバイル (3g など) ネットワークの両方を使用できます。
  • システム内に、使用状況を測定 (または制限) したり、広告を挿入したりするための準備が整っています。
  • ファイアウォールがデバイスへのインバウンド接続をブロックすることを心配する必要はありません (wifi では一般的ですが、モバイルではほとんどの場合そうです)。
  • デバイスの相対的な位置は関係ありません
  • スマートフォンやタブレットだけでなく、従来の PC やラップトップとも相互運用できます。
于 2012-05-05T04:51:00.947 に答える
2

私は WebService を使用します。これにより、サービスの実装がアプリから独立しているため、サービスの保守が容易になります。

プロ ウェブサービス:

  • 事前設定された DNS で到達可能
  • サービスの変更はアプリケーションには影響しません (バグ修正の可能性があるため、更新は必要ありません)

コントラ Web サービス:

  • すべてのトラフィックはサーバーを通過します
  • アプリケーションはサーバーに依存しています

通信でどのくらいのデータが転送されるかを自問する必要があります。直接接続を使用することの本当の利点はありますか?

于 2012-05-10T10:34:42.430 に答える
0

filehub を使用して、IOS と Android の間でファイルを転送できます。

iOS と Android デバイス間、またはモバイル デバイスと SD カード/USB HDD 間で写真/動画/音楽を転送できる fielhub という新しいデバイスが市場に出回っています。

于 2013-07-12T08:23:22.560 に答える