一:服务器端建立

1:下载Tomcat 以及 struts(框架:为了解决文件上传更简洁),后面会提供两个资源的下载链接。然后解压下载好的Tomcat和struts

2:配置tomcat:打开Myeclipse,打开window->perferences查找tomcat,然后将地址映射到上面解压的Tomcat包。不知道是不是我的电脑配置出现问题,导致我在perferences中没有查找到tomcat属性。所以我在创建WEB project中发现了配置Tomcat路径的地方,可参考1-5图片,完成tomcat配置。创建的WEB工程如6图

3:引入strust包:

3.1:找到解压后的struts2-blank.war包,将这个包在进行解压,找到WEB-INF文件夹,将WEB-INF里lib包内的架包拷贝到工程对应lib目录下。

3.2:将WEB-INF\classes下的struts.xml拷贝到工程的src目录下,里面的代码参考7图

3.3:打开WEB-INF 中webxml文件,将以下代码

<filter>
    <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>struts2</filter-name>
     <url-pattern>/*</url-pattern>
  </filter-mapping>  拷贝到工程中web.xml文件

3.4:配置好之后,选择run as ,将之前配置的Tomcat作为service服务开启。

4:新建一个包:com.imook.action,然后新建一个类UserAction,然后服务器端所有的代码如下:

package com.imook.action;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.logging.Logger;import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionSupport;public class UserAction extends ActionSupport{private String username;private String password;public File mPhoto;public String mPhotoFileName;//上传字符串到服务器public String postString() throws IOException{HttpServletRequest request = ServletActionContext.getRequest();ServletInputStream is = request.getInputStream();System.out.println("sessionId=" + request.getSession().getId());StringBuilder sb = new StringBuilder();int len = 0;byte[] buf = new byte[1024];while((len = is.read(buf)) != -1){sb.append(new String(buf,0,len));}System.out.println(sb.toString());return null;}//重命名图片以及username及passwordpublic String uploadInfo() throws IOException{System.out.println(username+"  ," + password);if(mPhoto == null){System.out.println(mPhotoFileName+"  is null .");}String dir = ServletActionContext.getServletContext().getRealPath("/files");File file = new File(dir,mPhotoFileName);FileUtils.copyFile(mPhoto, file);return null;}//上传图片文件public String postFile() throws IOException{HttpServletRequest request = ServletActionContext.getRequest();ServletInputStream is = request.getInputStream();System.out.println("sessionId=" + request.getSession().getId());String dir = ServletActionContext.getServletContext().getRealPath("files");File file = new File(dir,"wwx.jpg");  FileOutputStream fos = new FileOutputStream(file);int len = 0;byte[] buf = new byte[1024];while((len = is.read(buf)) != -1){fos.write(buf, 0, len);}HttpServletResponse response = ServletActionContext.getResponse();PrintWriter writer = response.getWriter();writer.write(dir);writer.flush();System.out.println("dir:"+dir);fos.flush();fos.close();return null;}//登陆public String login() throws IOException{HttpServletRequest request = ServletActionContext.getRequest();//userService.login(username,password);System.out.println("sessionId=" + request.getSession().getId());System.out.println(username+" , "+password);HttpServletResponse response = ServletActionContext.getResponse();PrintWriter writer = response.getWriter();writer.write("Login success !");writer.flush();return null;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}}

5:对应的struts代码:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd"><struts><constant name="struts.enable.DynamicMethodInvocation" value="true" /><constant name="struts.devMode" value="true" /><package name="default" namespace="/" extends="struts-default"><action name="login" class="com.imook.action.UserAction" method = "login"></action><action name="postString" class="com.imook.action.UserAction" method = "postString"></action><action name="postFile" class="com.imook.action.UserAction" method = "postFile"></action><action name="uploadInfo" class="com.imook.action.UserAction" method = "uploadInfo"></action></package><!-- Add packages here --></struts>

二:客户端

客户端就是创建一个Android 工程,具体的请参考代码:

1:MainActivity代码:

package nuro.nuro.okhttp;import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;import com.squareup.okhttp.Call;
import com.squareup.okhttp.Callback;
import com.squareup.okhttp.FormEncodingBuilder;
import com.squareup.okhttp.MediaType;
import com.squareup.okhttp.MultipartBuilder;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.RequestBody;
import com.squareup.okhttp.Response;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.CookieManager;
import java.net.CookiePolicy;public class MainActivity extends AppCompatActivity {private TextView tv_result;private ImageView iv_result;OkHttpClient okHttpClient = new OkHttpClient();private String mBaseUrl="http://192.168.1.113:8080/imook_okHttp/";private String TAG = "MainActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.content_main);okHttpClient.setCookieHandler(new CookieManager(null, CookiePolicy.ACCEPT_ALL));//保证服务器端的sessionId保证一致,保证用户登录一致tv_result = (TextView) findViewById(R.id.tv_result);iv_result = (ImageView)findViewById(R.id.iv_result);}/*封装代码步骤* 1:拿到okHttpClient对象* 2:构造Request2.1构造requestBody2.2包装requestBody3.call -> execute* */public void doPost(View view){//1:拿到okHttpClient对象FormEncodingBuilder requestBodyBuilder = new FormEncodingBuilder();//2:构造Request//2.1构造requestBodyRequestBody requestBody = requestBodyBuilder.add("username","wwx").add("password","930820").build();Request.Builder builder = new Request.Builder();Request request = builder.url(mBaseUrl + "login").post(requestBody).build();executeRequest(request);}public void doPostString(View view){//1:拿到okHttpClient对//2:构造Request//2.1构造requestBodyRequestBody requestBody = RequestBody.create(MediaType.parse("text/plain:charset=utf-8"), "{username:wwx,password:930820,sex:man,age:25}");Request.Builder builder = new Request.Builder();Request request = builder.url(mBaseUrl + "postString").post(requestBody).build();executeRequest(request);}public void doPostFile(View view){File file = new File(Environment.getExternalStorageDirectory(),"wwx.jpg");Log.i(TAG,Environment.getExternalStorageState());if (!file.exists()){L.e(file.getAbsolutePath()+" not exist!");return;}//mime type查看各个文件的MediaTypeRequestBody requestBody = RequestBody.create(MediaType.parse("application/octet-stream"),file);Request.Builder builder = new Request.Builder();Request request = builder.url(mBaseUrl + "postFile").post(requestBody).build();executeRequest(request);}public void doUpload(View view){File file = new File(Environment.getExternalStorageDirectory(),"ziji.png");Log.i(TAG,Environment.getExternalStorageState());if (!file.exists()){L.e(file.getAbsolutePath()+" not exist!");return;}MultipartBuilder multipartBuilder = new MultipartBuilder();RequestBody requestBody = multipartBuilder.type(MultipartBuilder.FORM)//.addFormDataPart("username", "wwx")//.addFormDataPart("password", "930820")//.addFormDataPart("mPhoto", "jizi.png", RequestBody.create(MediaType.parse("application/octet-stream"), file)).build();CountingRequestbody countingRequestbody = new CountingRequestbody(requestBody, new CountingRequestbody.Listner() {@Overridepublic void onRequestProgress(long bytesWrited, long contentLength) {L.e(bytesWrited + "/" + contentLength);}});//mime type查看各个文件的MediaTypeRequest.Builder builder = new Request.Builder();Request request = builder.url(mBaseUrl + "uploadInfo").post(countingRequestbody).build();executeRequest(request);}public void doDownload(View view){Request.Builder builder = new Request.Builder();Request request = builder.get().url(mBaseUrl+"files/wwx.jpg").build();Call call = okHttpClient.newCall(request);call.enqueue(new Callback() {//异步执行@Overridepublic void onFailure(Request request, IOException e) {L.e("onFailure :" + e.getMessage());e.printStackTrace();}@Overridepublic void onResponse(Response response) throws IOException {L.e("onResponse :");final long total = response.body().contentLength();//文件总长度long sum = 0L;InputStream is = response.body().byteStream();int len = 0;File file = new File(Environment.getExternalStorageDirectory(), "wwx12306.jpg");byte[] buf = new byte[128];FileOutputStream fos = new FileOutputStream(file);while ((len = is.read(buf)) != -1) {fos.write(buf, 0, len);sum += len;//进度比例L.e(sum + "/" + total);final long finalsum = sum;runOnUiThread(new Runnable() {@Overridepublic void run() {tv_result.setText(finalsum+"/"+total);}});}fos.flush();fos.close();is.close();L.e("download success!");}});}public void doDownloadImg(View view){Request.Builder builder = new Request.Builder();Request request = builder.get().url(mBaseUrl+"files/jizi.png").build();Call call = okHttpClient.newCall(request);call.enqueue(new Callback() {//异步执行@Overridepublic void onFailure(Request request, IOException e) {L.e("onFailure :" + e.getMessage());e.printStackTrace();}@Overridepublic void onResponse(Response response) throws IOException {L.e("onResponse :");InputStream is = response.body().byteStream();final Bitmap bitmap = BitmapFactory.decodeStream(is);runOnUiThread(new Runnable() {@Overridepublic void run() {iv_result.setImageBitmap(bitmap);}});}});}public void doGet(View view) throws IOException {//1:拿到okHttpClient对象//2:构造RequestRequest.Builder builder = new Request.Builder();Request request = builder.get().url(mBaseUrl+"login?username=wwx&password=654321").build();executeRequest(request);}private void executeRequest(Request request) {//3:将request封装成callCall call = okHttpClient.newCall(request);//4:执行//call.execute();//立即执行call.enqueue(new Callback() {//异步执行@Overridepublic void onFailure(Request request, IOException e) {L.e("onFailure :" + e.getMessage());e.printStackTrace();}@Overridepublic void onResponse(Response response) throws IOException {L.e("onResponse :");final String res = response.body().string();L.e(res);//此时是子线程,不能直接设置UI控件更新的原因可能是为了支持大文件的下载runOnUiThread(new Runnable() {@Overridepublic void run() {tv_result.setText(res);}});}});}}

2:xml文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"android:orientation="vertical"app:layout_behavior="@string/appbar_scrolling_view_behavior"tools:context="nuro.nuro.okhttp.MainActivity"tools:showIn="@layout/activity_main"><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Get"android:onClick="doGet"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="post"android:onClick="doPost"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="post String"android:onClick="doPostString"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="post File"android:onClick="doPostFile"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Upload"android:onClick="doUpload"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Download"android:onClick="doDownload"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="DownloadImage"android:onClick="doDownloadImg"/><TextViewandroid:id="@+id/tv_result"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="Hello World!" /><ImageViewandroid:id="@+id/iv_result"android:layout_width="match_parent"android:layout_height="wrap_content"android:scaleType="centerCrop"/>
</LinearLayout>

3:封装的一个打印信息L代码:

package nuro.nuro.okhttp;/*** Created by Administrator on 2017/8/1.*/
public class L{private static boolean debug = true;private static String TAG = "imook_okhttp";public static void e(String msg){if (debug){android.util.Log.e(TAG,msg);}}
}

4:在MainFest中记得添加相应的权限:

     <uses-permission android:name="android.permission.INTERNET"></uses-permission><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
    

三:总结:

这个例子介绍了服务器的简单搭建,做到了Android客户端上传string(也可以是json格式),图片、文件到服务器的指定目录下,然后提供了从服务器上下载图片文件的方法。

其中在:

1:客户端上传图片到服务器中,因为映射到服务器的地址不对,导致客户端上传的图片,服务器一直没有接收到。产生这个的原因是:没有将Tomcat映射的路径配置正确。正确的方式是要在新建web工程后配置Tomcat的路径。

2:另外一个是比较大的图片不能显示,原因:代码里没有增加压缩图片的步骤,部分图片过大显示不出来。

3:上传以及下载的进度可以在进行完善,使用进度条来显示。

各位:有不明白的或者有错误的地方,大家请指教。QQ:1143403680

Android中服务器端与客户端交互相关推荐

  1. [转]Android中程序与Service交互的方式——交互方式

    本文转自:http://blog.csdn.net/yihongyuelan/article/details/7216188 上一篇文章:Android中程序与Service交互的方式--综述 简述了 ...

  2. android 和h5交互,Android中与H5的交互

    Android日常开发中,常常会遇到加载H5页面的情况,于是少不了与H5页面的交互问题.具体表现在Android调用H5代码及H5中调用Android代码两种情况. 测试页面 test.png 这里我 ...

  3. Android中程序与Service交互的方式

    本文将通过三大部分来讲解Android中程序与Service的交互方式,这里说的交互方式指的是如何与Service进行消息的传递,比如:从Service中获取信息,向Service发送信息等等.举个简 ...

  4. android java 调用js,Android中Java和JavaScript交互实例

    Android提供了一个很强大的WebView控件用来处理Web网页,而在网页中,JavaScript又是一个很举足轻重的脚本.本文将介绍如何实现Java代码和Javascript代码的相互调用. 如 ...

  5. Android中接入微信客户端

    最近因为工作的项目中要接入微信开放平台,于是一直在做这方面的工作,再加上比较忙,所以只有现在才有机会来记录一下关于程序中接入微信开放平台的事情. 目前android版只支持SDK接入微信,朋友圈分享功 ...

  6. 网络游戏中服务器端与客户端分别处理哪些事情

    根据情况不同,客户端做的事情都有不同. 服务器至少要做验证. 相对于网络游戏来说,数据传输量在一定程度上可以忽略,而更注重数据来回时间.在一般情况下,比如说WOW里面,200MS延迟就开始变黄.也就是 ...

  7. Android中基于Socket的网络通信

    1. Socket介绍 2. ServerSocket的建立与使用 3. 使用ServerSocket建立聊天服务器-1 4. 使用ServerSocket建立聊天服务器-2 5. 在Android中 ...

  8. android设置主题的方法,Android_修改Android App样式风格的方法,android中可以自定义主题和风格 - phpStudy...

    修改Android App样式风格的方法 android中可以自定义主题和风格.风格,也就是style,我们可以将一些统一的属性拿出来,比方说,长,宽,字体大小,字体颜色等等.可以在res/value ...

  9. Android中ActivityManagerService与应用程序(客户端)通信模型分析

    今天主要分析下ActivityManagerService(服务端) 与应用程序(客户端)之间的通信模型,在介绍这个通信模型的基础上,再 简单介绍实现这个模型所需要数据类型. 本文所介绍内容基于and ...

最新文章

  1. thinkphp 调用php文件上传,ThinkPHP实现带验证码的文件上传功能实例
  2. static用法总结
  3. 报名 | 清华大学大数据能力提升项目报名指南 (2020秋)
  4. OC动态创建的问题变量数组.有数组,在阵列13要素,第一个数据包阵列,每3元素为一组,分成若干组,这些数据包的统一管理。最后,一个数组.(要动态地创建一个数组).两种方法...
  5. WebService大讲堂之Axis2(4):二进制文件传输
  6. asp.net中的<%%>形式的详细用法总结
  7. Session id的存储
  8. Python format() 函数
  9. 暑假集训-8.06总结
  10. java压缩_Java压缩
  11. 让div垂直居中的5种方法
  12. java gzip 文件夹_Java GZip 基于磁盘实现压缩和解压的方法
  13. DL之RNN:人工智能为你写诗——基于TF利用RNN算法实现【机器为你写诗】、训练测试过程全记录
  14. failed shard on node [XXX], failed recovery, failure RecoveryFailedException
  15. 中国冰淇淋市场深度评估及发展趋势预测报告(2022版)
  16. kubeadm部署k8s集群
  17. php判断浏览器语言国内外,PHP判断浏览器语言
  18. iOS开发三方资源 - 欲先攻其事必先利其器
  19. rtx服务器设置 文件,rtx 服务器 文件传输 配置
  20. 宽带连接远程计算机691,电脑宽带连接错误691怎么办? 爱问知识人

热门文章

  1. 剑指算法:二维数组的查找
  2. 新技术共筑数据安全 新基建重塑数智未来 ——众享比特2020战略发布会圆满举办
  3. Golang读写锁应用
  4. 【树莓派】error: command ‘/usr/bin/arm-linux-gnueabihf-gcc‘ failed with exit code 1(2021年12月)
  5. stm32两轮平衡车项目资料 两轮平衡车原理图+PCB+程序
  6. python中文下载_Python进阶中文PDF[17.1MB] 高清下载
  7. VUE+bpmn.js+iview 页面绘制流程图
  8. 【pen200-lab】10.11.1.14
  9. MATLAB基于视频的人体姿态检测
  10. 基于JSP的JAVA email邮件系统研发