在Android设备之间传输文件?
问题描述:
我正在做一个代码,我想发送一个mp4文件到另一个Android设备。我已经通过Wifi连接两个Android,并从一个简单的1-20周期写入,另一个Android设备读取并显示发送的号码。在Android设备之间传输文件?
这是 “发件人” 的有趣的部分:
InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
Log.d("ClientActivity", "C: Connecting...");
Socket socket = new Socket(serverAddr, port);
connected = true;
while (connected) {
try {
Log.d("ClientActivity", "C: Sending command.");
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket
.getOutputStream())), true);
for (int i = 1; i < 20; i++) {
out.println(i);
i=i++;
和 “接收器”:
serverSocket = new ServerSocket(SERVERPORT);
// listen for incoming clients
Socket client = serverSocket.accept();
BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()),8*1024);
这个伟大的工程!但我想从一个设备发送文件到另一个而不是一个int。我该如何做到这一点?
答
您需要通过某种数据格式将数据打包到流中。一种方法是使用通常用于在电子邮件中发送附件的通用MIME数据格式。
我已经回答了在the following SO Question - android add filename to bytestream中使用此格式通过套接字发送二进制文件的其他相关问题。您可以查看该问题的接受答案。
为了供您参考,我刚刚从以下问题中复制了通过套接字发送和接收的代码。
File f = new File(path);
BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream());
String filename=path.substring(path.lastIndexOf("/")+1);
// create a multipart message
MultipartEntity multipartContent = new MultipartEntity();
// send the file inputstream as data
InputStreamBody isb = new InputStreamBody(new FileInputStream(f), "image/jpeg", filename);
// add key value pair. The key "imageFile" is arbitrary
multipartContent.addPart("imageFile", isb);
multipartContent.writeTo(out);
out.flush();
out.close();
并且使用属于JavaMail的MimeBodyPart来回读以下代码。
MimeMultipart multiPartMessage = new MimeMultipart(new DataSource() {
@Override
public String getContentType() {
// this could be anything need be, this is just my test case and illustration
return "image/jpeg";
}
@Override
public InputStream getInputStream() throws IOException {
// socket is the socket that you get from Socket.accept()
BufferedInputStream inputStream = new BufferedInputStream(socket.getInputStream());
return inputStream;
}
@Override
public String getName() {
return "socketDataSource";
}
@Override
public OutputStream getOutputStream() throws IOException {
return socket.getOutputStream();
}
});
// get the first body of the multipart message
BodyPart bodyPart = multiPartMessage.getBodyPart(0);
// get the filename back from the message
String filename = bodyPart.getFileName();
// get the inputstream back
InputStream bodyInputStream = bodyPart.getInputStream();
// do what you need to do here....
不错!所以我会忽略文件名的一部分。 什么是“multipartContent.addPart(”imageFile“,isb); ”??? 而我怎样才能得到另一个Android手机中的文件?因为你指定的答案是为JavaMail? 谢谢! – Merol
由于JavaMail包含MIME格式的库(MimeMultipart),因此只使用JavaMail,但它与邮件无关。文件名基本上是您传输到另一端的文件名的元数据(如果没关系,您可以放入任何内容),“imageFile”只是数据的关键字,您可以将其命名为任何内容。这只是作为一个样本。如果我需要在我的项目中传输二进制文件,我使用相同的模式,因为这证明可以在电子邮件附件中使用。这比设计我自己的数据格式更简单 – momo