android 通过socket上传文件到服务器并返回数据,急啊!!!
给大神是这样的,我在android上要通过socket上传一个文件和一些相关数据到服务器,然后我在服务器接收数据后并处理完成需要向android客户端返回一些相应数据,这些数据时通过PrintWriter out = request.getWriter() 对象打印的。我在客户端怎么接收这些数据啊 ?
这是客户端发送文件的方法:
public static boolean postFileUseSocket(String path, Map<String, String> params, FormFile[] files) throws Exception{
final String BOUNDARY = "---------------------------7da2137580612"; //数据分隔线
final String endline = "--" + BOUNDARY + "--\r\n";//数据结束标志
int fileDataLength = 0;
for(FormFile uploadFile : files){//得到文件类型数据的总长度
StringBuilder fileExplain = new StringBuilder();
fileExplain.append("--");
fileExplain.append(BOUNDARY);
fileExplain.append("\r\n");//-----------------------------7da2137580612
fileExplain.append("Content-Disposition: form-data;name=""+ uploadFile.getParameterName()+"";filename=""+ uploadFile.getFilname() + ""\r\n");
fileExplain.append("Content-Type: "+ uploadFile.getContentType()+"\r\n\r\n");
fileExplain.append("\r\n");
fileDataLength += fileExplain.length();
if(uploadFile.getInStream()!=null){
fileDataLength += uploadFile.getFile().length();
}else{
fileDataLength += uploadFile.getData().length;
}
}
StringBuilder textEntity = new StringBuilder();
for (Map.Entry<String, String> entry : params.entrySet()) {//构造文本类型参数的实体数据
textEntity.append("--");
textEntity.append(BOUNDARY);
textEntity.append("\r\n");
textEntity.append("Content-Disposition: form-data; name=""+ entry.getKey() + ""\r\n\r\n");
textEntity.append(entry.getValue());
textEntity.append("\r\n");
}
//计算传输给服务器的实体数据总长度
int dataLength = textEntity.toString().getBytes().length + fileDataLength + endline.getBytes().length;
URL url = new URL(path);
int port = url.getPort()==-1 ? 80 : url.getPort();
Socket socket = new Socket(InetAddress.getByName(url.getHost()), port);
// socket.setKeepAlive(true);
OutputStream outStream = socket.getOutputStream();
//下面完成HTTP请求头的发送
String requestmethod = "POST "+ url.getPath()+" HTTP/1.1\r\n";
outStream.write(requestmethod.getBytes());
String accept = "Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*\r\n";
outStream.write(accept.getBytes());
String language = "Accept-Language: zh-CN\r\n";
outStream.write(language.getBytes());
String contenttype = "Content-Type: multipart/form-data; boundary="+ BOUNDARY+ "\r\n";
outStream.write(contenttype.getBytes());
String contentlength = "Content-Length: "+ dataLength + "\r\n";
outStream.write(contentlength.getBytes());
String alive = "Connection: Keep-Alive\r\n";
outStream.write(alive.getBytes());
String host = "Host: "+ url.getHost() +":"+ port +"\r\n";
outStream.write(host.getBytes());
//写完HTTP请求头后根据HTTP协议再写一个回车换行
outStream.write("\r\n".getBytes());
//把所有文本类型的实体数据发送出来
outStream.write(textEntity.toString().getBytes());
//把所有文件类型的实体数据发送出来
for(FormFile uploadFile : files){
StringBuilder fileEntity = new StringBuilder();
fileEntity.append("--");
fileEntity.append(BOUNDARY);
fileEntity.append("\r\n");
fileEntity.append("Content-Disposition: form-data;name=""+ uploadFile.getParameterName()+"";filename=""+ uploadFile.getFilname() + ""\r\n");
fileEntity.append("Content-Type: "+ uploadFile.getContentType()+"\r\n\r\n");
outStream.write(fileEntity.toString().getBytes());
if(uploadFile.getInStream()!=null){
byte[] buffer = new byte[1024];
int len = 0;
while((len = uploadFile.getInStream().read(buffer, 0, 1024))!=-1){
outStream.write(buffer, 0, len);
}
uploadFile.getInStream().close();
}else{
outStream.write(uploadFile.getData(), 0, uploadFile.getData().length);
}
outStream.write("\r\n".getBytes());
}
//下面发送数据结束标志,表示数据已经结束
outStream.write(endline.getBytes());
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String result =reader.readLine();
if(result.indexOf("200")==-1){//读取web服务器返回的数据,判断请求码是否为200,如果不是200,代表请求失败
return false;
}
// Log.i("reponse",line);
outStream.flush();
outStream.close();
reader.close();
socket.close();
return true;
}
这是客户端接收数据并返回结果的代码:
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 获得文件项工厂
FileItemFactory factory = new DiskFileItemFactory();
// 获得Servlet文件上传对象
ServletFileUpload upload = new ServletFileUpload(factory);
response.setContentType("text/html");
PrintWriter out = response.getWriter();
UploadFileDao dao = new UploadFileDaoImpl();
UploadFile uf = new UploadFile();
String tempPath = "";
UserDao udao = new UserDaoImpl();
boolean mark = false;
try {
// 解析请求
List items = upload.parseRequest(request);
Iterator iter = items.iterator();
// 迭代文件域
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();
// 判断是普通文本域
if (item.isFormField()) {
String fieldName = item.getFieldName();
if (fieldName.toLowerCase().equals("uploadtime")) {
uf.setUploadTime(new String(item.getString().getBytes(
"iso-8859-1"), "utf-8"));
}
if (fieldName.toLowerCase().equals("audiodesc")) {
uf.setFileDesc(new String(item.getString().getBytes(
"iso-8859-1"), "utf-8"));
}
if (fieldName.toLowerCase().equals("audioname")) {
uf.setFileName(new String(item.getString().getBytes(
"iso-8859-1"), "utf-8"));
}
if (fieldName.toLowerCase().equals("audiouploadpersoncode")) {
uf.setUploadPersonCode(new String(item.getString()
.getBytes("iso-8859-1"), "utf-8"));
}
} else {
// 判断是文件域
String fullFileName = item.getName();
int idx = fullFileName.lastIndexOf(".");
String subfix = fullFileName.substring(idx);
String dateStr = new Date().getTime() + "";
String fileName = dateStr + subfix;
uf.setCode(dateStr);
String path = this.getServletContext().getRealPath(
"\\audio");
File f = new File(path + "\" + fileName);
System.out.println(path);
tempPath = path + "\" + fileName;
File dir = new File(path);
if (!dir.exists()) {
dir.mkdirs();
}
uf.setFilePath(tempPath);
User user = udao.queryIsExist(uf.getUploadPersonCode());
if(user != null){
mark = dao.saveAudio(uf);
item.write(f);
if (mark) {
out.print("1");
} else {
out.print("0");
}
}else{
out.print("2");
}
}
}
} catch (Exception e) {
e.printStackTrace();
out.print("0");
}
out.flush();
out.close();
}
各位大神帮我看看怎么弄啊!非常感谢!
[解决办法]
添添人气
[解决办法]
帮顶,socket一直都没接触过,望楼主早日解决
[解决办法]
客户端发完了数据,就直接read那个socket就行了,读回来的数据可能需要自己解析一下,其实还不如用httpclient更简单一些