我试图通过套接字在android中发送文件。我想用字节流添加文件名,然后将其发送到服务器。我怎么做?然后我如何在接收端分离文件名? 这是发送文件的代码:
Log.i("SocketOP", "sendFILE-1");
File f = new File(path);
String filename=path.substring(path.lastIndexOf("/")+1);
System.out.println("filename:"+filename);
fin.filename = "~"+filename;
BufferedOutputStream out = new BufferedOutputStream( socket.getOutputStream() );
FileInputStream fileIn = new FileInputStream(f);
Log.i("SocketOP", "sendFILE-2");
byte [] buffer = new byte [(int)f.length()];
System.out.println("SO sendFile f.length();" + f.length());
int bytesRead =0;
while ((bytesRead = fileIn.read(buffer)) > 0) {
out.write(buffer, 0, buffer.length);
System.out.println("SO sendFile" + bytesRead +filename);
}
out.flush();
out.close();
fileIn.close();
Log.i("SocketOP", "sendFILE-3");
答案 0 :(得分:1)
如果这是您自己的协议,那么您创建一个数据包,将两个部分(文件名和数据)分开。您需要通过特定边界清楚地表示分离。
在服务器上,由于您了解协议,服务器将回读整个数据包,并根据给定的边界将文件名和数据分开。
MIME data format正好使用这种数据交换并广泛用于HTTP协议。如果您使用相同的MIME数据格式,另一个优点是您可以使用第三方库对您的数据进行编码和解码,例如HttpMime
下面是使用MIME数据格式化数据并通过Socket
发送的粗略代码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();
请注意,您需要来自HttpMime项目的org.apache.http.entity.mime.MultipartEntity和org.apache.http.entity.mime.content.InputStreamBody。在服务器上,您需要MIME解析器来获取文件名和所有字节内容
要在服务器上读回输入流,您需要一个类来解析MIME消息。您不必自己编写解析器,因为MIME已经是一种流行的消息格式,除非您想要了解MIME消息结构。
下面是使用MimeBodyPart的示例代码,它是JavaMail的一部分。
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....
您可以从Oracle Website下载JavaMail,它也依赖于Java Activation Framework