`
师大黄飞
  • 浏览: 45254 次
  • 性别: 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
分享到:
评论

相关推荐

    Android与Javaweb服务器通信

    这个过程就是Android与Java Web服务器通信的基础。 此外,对于初学者来说,理解JSON数据格式也很重要,因为它是Android和服务器间最常见的数据交换格式。你可以使用Gson或Jackson库在Java中解析和生成JSON,而在...

    Android与JavaWeb的互相访问

    这个主题涉及到如何让Android客户端能够与JavaWeb服务器进行数据交互,以及如何利用JavaWeb技术来提供用户界面。让我们深入探讨一下这个领域的相关知识点。 首先,**Android**是一个基于Linux内核的开源操作系统,...

    javaweb与Android通信代码

    通过理解这些基本概念和技术,开发者能够实现Java Web应用与Android应用之间的有效通信。不过,实际项目中可能还需要根据具体需求进行更多的定制和优化。文件“hello源码”可能包含具体的示例代码,供开发者参考学习...

    Android客户端+JavaWeb服务器远程登入

    在IT行业中,构建一个能够实现远程登录功能的系统是一项常见的任务。...通过上述知识点的实施,我们可以构建出一个功能完善的远程登录系统,实现Android客户端与JavaWeb服务器之间的安全、高效的数据交换。

    本科毕业设计,一个基于Android的APP作为客户端,服务器端则是JavaWeb项目。.zip

    本篇将详细解析一个本科毕业设计项目,该设计是一个基于Android的APP客户端与JavaWeb服务器端相结合的应用。首先,我们要理解这个项目的两个核心组成部分:Android客户端和JavaWeb服务器。 **一、Android客户端** ...

    安卓网站交互JSONxmlWebserviceUPnP相关-简单的Android开发例子连接后台Javaweb服务器程序实现简单的注册登录功能适合简单项目的代码移植.rar

    这个压缩包文件包含了一个简单的Android应用开发示例,主要展示了如何与Java Web服务器进行交互,实现用户注册和登录的功能。这个项目对于初学者或者需要快速搭建简单应用的开发者来说非常有帮助,因为它提供了代码...

    安卓+javaWeb

    例如,安卓应用可能会发送一个登录请求到JavaWeb服务器,服务器验证成功后返回会话令牌,安卓应用再用该令牌进行后续的API调用。 此外,现代化的开发实践中,通常会采用MVC(Model-View-Controller)或MVVM(Model-...

    android图书管理系统+javaweb后台服务器代码

    《Android图书管理系统+JavaWeb后台服务器代码》是一个综合性的项目,涵盖了移动应用开发与服务器端开发的关键技术。这个系统主要用于图书的管理,包括图书的添加、查询、借阅、归还等功能,为用户提供便捷的图书...

    json实现android客户端与服务器通信,用到数据库

    二、Android客户端与服务器通信 1. 创建HTTP请求:Android客户端通常使用HttpURLConnection或OkHttp库发起HTTP请求,向服务器发送GET或POST请求,请求中携带JSON数据。 2. JSON序列化与反序列化:使用Gson、Jackson...

    通过Android客户端访问web服务器,实现一个登录功能,服务端+数据库+安卓端

    在开发移动应用时,尤其是Android应用,与服务器进行交互是必不可少的部分。本项目涉及的核心知识点是构建一个完整的登录系统,包括Android客户端、Web服务器以及MySQL数据库。以下将详细阐述每个环节的关键技术和...

    android和javaweb交互

    在IT领域,Android和Java Web交互是开发过程中常见的需求,特别是在构建混合移动应用或实现后台服务与移动客户端通信时。本文将深入探讨这个主题,帮助初学者理解和掌握两者之间的交互技术。 1. **Android与Java ...

    服务器端与客户端进行通信

    在这个场景中,我们讨论的是JavaWeb服务器端与Android客户端之间通过JSON数据进行通信。下面将详细解释这个过程涉及的关键知识点。 首先,**服务器端(JavaWeb)**通常使用Servlet、JSP或Spring Boot等技术来处理...

    Android-JavaWeb程序运行说明文档

    - **或者**:这表明系统支持两种模式的通信——移动客户端与后端服务器之间的通信以及网页端与后端服务器之间的通信。 ### 知识点二:开发工具说明 #### 2.1 开发工具介绍 - **Android Studio**:用于开发Android...

    app与javaweb 交互数据

    这里的"app"通常指的是Android应用,它运行在移动设备上,而"javaweb"指的是基于Java技术的Web应用,部署在服务器端。它们之间的数据交互是通过客户端-服务器模式实现的,客户端发送请求到服务器,服务器处理请求并...

    安卓网站交互JSONxmlWebserviceUPnP相关-服务器端javaWeb与客户端android进行通信传送json数据使用xutls进行网络访问注释很详细教你做后台.rar

    服务器端(javaWeb)与客户端(android)进行通信,传送json数据, 使用xutls进行网络访问, 注释很详细,教你做后台.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。

    Android通过JavaWeb实现用户登录(一).docx

    在本教程中,我们将探讨如何在Android应用中通过JavaWeb实现用户登录功能,这涉及到Android客户端与后端服务器之间的通信,以及数据存储和检索。首先,我们从Android端的界面设计开始。 `activity_main.xml` 文件是...

    javaweb-jar包.zip

    在Java Web开发中,无论是读取配置文件、处理服务器端的文件操作还是网络通信,Commons-IO都能提供帮助。 这些组件都是Java Web开发中的基础和核心部分,它们的组合在"javaweb-jar包.zip"中提供了一站式的解决方案...

    毕业设计,安卓Android APP,大学生校园论坛交流系统App,包括安卓服务器端和安卓客户端,内含完整源码、数据库脚本

    毕业设计,安卓Android APP,大学生校园论坛交流系统App,包括安卓服务器端和安卓客户端,内含完整源码 安卓Android大学生校园论坛交流系统 系统开发环境: Windows + Myclipse(服务器端) + Eclipse(手机客户端) + ...

    基于JavaWeb和Android的基站发电稽核系统的设计.zip

    4. **网络通信**:Android客户端需要与JavaWeb服务器通信,可能使用HttpURLConnection、OkHttp或者Retrofit等库来实现HTTP请求。 5. **异步处理与生命周期**:由于网络操作是耗时的,Android应用通常使用AsyncTask...

Global site tag (gtag.js) - Google Analytics