首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Android >

android 通过socket上传文件到服务器并返回数据,该如何解决

2013-12-16 
android 通过socket上传文件到服务器并返回数据,急啊!!!给大神是这样的,我在android上要通过socket上传一

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更简单一些

热点排行