问题
How can i transfer data between two device? I would like to transfer data (mostly image file) between different platforms (android,iphone). Is it possible to use p2p or should i use client-server?
Any help will be appreciated.
回答1:
While p2p is possible in some cases, you will achieve the most widespread compatibility with a client-server architecture, at the cost of having to deploy, power, connect, and maintain servers.
- You will be able to use both wifi access points and mobile (3g, etc) networks
- You have a ready place in the system to measure (or restrict) usage and/or insert ads
- You don't have to worry about firewalls blocking inbound connections to the devices (common on wifi, almost always the case on mobile)
- Relative locations of the devices are irrelevant
- You can interoperate not only with smartphones and tablets, but with traditional PCs and laptops
回答2:
Have you looked at Qualcomm's AllJoyn library? It works over Bluetooth or wifi only.
The below code is copied from this 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();
}
}
}
回答3:
If you are OK with Bump, Then they provide an API for the developers to use and its pretty simple to use. Check this out.
To see a live demo of transferring between iOS and Android @ youtube.
Detailed code snippet and example in Github.
PS: i don't belong to bu.mp :).
回答4:
I would use a WebService. That makes it easier to maintain your service, becuase the Service Implementation is independent of your app.
Pro Webservice:
- Reachable under a pre configured DNS
- Modifications on the Service do not affect the Application (No updates needed on possible bugfixes)
Contra Webservice:
- All the traffic goes through your Server
- Application relies on your Server
The you should ask yourself the question, how much data is transferred in your communication? Is there a real benefit of using direct connections?
回答5:
You can use filehub to transfer files between IOS and android.
there is a new device called fielhub on the market can transfer photos/movies/music between iOS and Android Devices, or between mobile devices and SD Card/USB HDD.. I think it is called ravpower filehub.
来源:https://stackoverflow.com/questions/10414273/how-to-transfer-data-between-two-device-android-iphone