`
师大黄飞
  • 浏览: 43965 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

安卓与JavaWeb服务器通信

阅读更多

很久没写博客了,因为感觉自己了解的东西都不太透彻。然而最近在给学校做一个APP,所以先来缕清一下主要的方法。客户端安卓与JavaWeb后台之间的Json通信。

        一、文字信息的传输.

安卓端代码

 

public static JSONArray getJsons(String url) {//传入你需要访问的地址
/********************************向后台传送Json************************************/
JSONArray Jsons = null;//创建Json对象
HttpPost request = new HttpPost(url);//创建HttpPost对象
HttpClient client=new DefaultHttpClient();//创建 DefaultHttpClient()
HttpResponse response;
try {
/*
如果要想后台传递参数的话.
JSONObject json=new JSONObject();差u币过海
json.put("name1", value1);
json.put("name2", value2);
request.setEntity(new StringEntity(json.toString()))//将Json包装成Entity实体,传送
*/
response = client.execute(request);//发送HTTP GET或HTTP POST请求,返回HttpResponse
 
/*****************************************接收后台返回的Json******************************************/
  if(response.getStatusLine().getStatusCode() == 200){  //页面状态码,200请求成功,502未找到
   String    result = EntityUtils.toString(response.getEntity(),"utf-8");   //获取返回服务器端response传输的报文
   //如果需要后台返回的是JsonArray参数
   Jsons=new JSONArray(result);//转换成JsonArray
   }  
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} 
 catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
 
    //关闭连接  
    if (client != null) {  
        client.getConnectionManager().shutdown();  
    }  
return Jsons;
}

 

 后台代码

 

	//获取安卓客户端传过来的json参数
public static JSONObject getJson(HttpServletRequest req){
	JSONObject Json=null;
	 try {
		 //包装request的输入流
		BufferedReader br = new BufferedReader(  
		new InputStreamReader((ServletInputStream) req.getInputStream(), "utf-8"));
		//缓冲字符
	        StringBuffer sb=new StringBuffer("");
	        String line;
	        while((line=br.readLine())!=null){
		sb.append(line);
	}
	br.close();//关闭缓冲流
	String result=sb.toString();//转换成字符
	Json=new JSONObject(result);//将字符转换成Json
	 } catch (Exception e) {
		e.printStackTrace();
	}  
	return Json;
}

	//服务器向安卓客户端传送jsonarray参数
public static void WriteJsons(HttpServletResponse rep,JSONArray jsons) throws IOException{
	String result=jsons.toString();//将jsons转换成字符
        rep.setCharacterEncoding("utf-8");//设置编码
	PrintWriter print=rep.getWriter();//获取response的write
 	print.write(result);//写入result
}

二、资源的传输

你可能需要从客户端上传音频或者图片和视频。

安卓端代码

/******************包装你需要上传的内容******************/

FormFile(File file, String name, String contentType)(这里就是模拟html     <input type="file" name="name"/>  contentType使用application/octet-stream就好,就是随意什么文件)

public class FormFile {
    /* 上传文件的数据 */
    private byte[] data;
    private InputStream inStream;
    private File file;
    /* 文件名称 */
    private String filname;
    /* 请求参数名称*/
    private String parameterName;
    /* 内容类型 */
    private String contentType = "application/octet-stream";
    
    public FormFile(String filname, byte[] data, String parameterName, String contentType) {
        this.data = data;
        this.filname = filname;
        this.parameterName = parameterName;
        if(contentType!=null) this.contentType = contentType;
    }
  public FormFile(File file, String parameterName, String contentType) {
  this.parameterName = parameterName;
  this.file = file;
  try {
      this.inStream = new FileInputStream(file);
  } catch (FileNotFoundException e) {
      e.printStackTrace();
  }
  if(contentType!=null) this.contentType = contentType;
}

public File getFile() {
  return file;
}

public InputStream getInStream() {
  return inStream;
}

public byte[] getData() {
  return data;
}

public String getFilname() {
  return file.getName();
}

public void setFilname(String filname) {
  this.filname = filname;
}

public String getParameterName() {
  return parameterName;
}

public void setParameterName(String parameterName) {
  this.parameterName = parameterName;
}

public String getContentType() {
  return contentType;
}

public void setContentType(String contentType) {
  this.contentType = contentType;
}
}

 

/************************工具类1***********************/

public class SocketHttpRequester {
    /**
     * 直接通过HTTP协议提交数据到服务器,实现如下面表单提交功能:
     *   <FORM METHOD=POST ACTION="http://192.168.1.101:8083/upload/servlet/UploadServlet" enctype="multipart/form-data">
            <INPUT TYPE="text" NAME="name">
            <INPUT TYPE="text" NAME="id">
            <input type="file" name="imagefile"/>
            <input type="file" name="zip"/>
         </FORM>
     * @param path 上传路径(注:避免使用localhost或127.0.0.1这样的路径测试,因为它会指向手机模拟器,你可以使用http://www.iteye.cn或http://192.168.1.101:8083这样的路径测试)
     * @param params 请求参数 key为参数名,value为参数值
     * @param file 上传文件
     */
    public static boolean post(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");
             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.getSendBufferSize()
        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 s=reader.readLine();
        //成功返回的是"http 200 ok" 艹!
     //   if(s.indexOf("200")==1){//读取web服务器返回的数据,判断请求码是否为200,如果不是200,代表请求失败
        if( s.contains("200")){
        	outStream.flush();
               outStream.close();
               reader.close();
               socket.close();
        	return true;
        }
        outStream.flush();
        outStream.close();
        reader.close();
        socket.close();
        return false;
    }
    
    /**
     * 提交数据到服务器
     * @param path 上传路径(注:避免使用localhost或127.0.0.1这样的路径测试,因为它会指向手机模拟器,你可以使用http://192.168.1.10:8080这样的路径测试)
     * @param params 请求参数 key为参数名,value为参数值
     * @param file 上传文件
     */
    public static boolean post(String path, Map<String, String> params, FormFile file) throws Exception{
       return post(path, params, new FormFile[]{file});
    }
}
 

 使用实例

//包装	
        String requestUrl=MyUrlUtil.UpLoadUrl;//服务器地址
	FormFile formfile = 
        new FormFile(file,"image","application/octet-stream");
//参数
        Map<String,String>  params=new HashMap<String,String>();
        params.put("name", value);
//上传
        SocketHttpRequester.post(requestUrl, params, formfile);
      

 后台端代码

File file=(File)request.getAttribute("name")(这里的name就是客户端FormFile中的name参数)
获取传递过来的参数
String Parma=request.getParameter("参数名");
这样就获取到的传过来的文件
然后将File写入本地,比如是jpg图片,写入***.jpg文件中

 

 

1
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics