网络编程2
来源:互联网 发布:淘宝装修购买 编辑:程序博客网 时间:2024/06/11 14:06
1.乘法表.
代码实现过程
[1]搭建UI
[2]servlet代码
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.获取客户端提交的数据 String name = request.getParameter("name"); int number = Integer.parseInt(name); //2.根据name给客户端返回一个乘法表 通过response对象给客户端一个响应 for (int i = 1; i <= number ; i++) { for (int j = 1; j <=i ; j++) { response.getWriter().write(i+"*"+j+"="+i*j +""); //1*1=1 } response.getWriter().println(); } }
2.文件上传案例
朋友圈 ,邮箱上传附件.百度云盘 360云盘.
代码实现过程:
客户端要求:
[1]要求form表单必须有一个文件上传项
[2]请求的方式必须为post 因为get提交数据有大小的限制
[3]必须加上一个enctype = multipart/form-data 否则请求体里面没有内容
服务器逻辑:
@MultipartConfig@WebServlet("/fileUploadDemo")public class FileUPloadDemo extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); //1.获取客户端上传的文件内容 根据name属性获取 Part part = request.getPart("file"); //part对象里面封装了我们要上传的文件内容 //2.把上传的内容 写到服务器目录下的一个文件里 首先获取fileupload真实路径 String realPath = getServletContext().getRealPath("fileUpload"); System.out.println("上传的路径:"+realPath); //3.获取客户端上传文件名 根据part对象获取头信息 String header = part.getHeader("Content-Disposition"); String[] split = header.split(";"); String[] split2 = split[2].split("="); String fileName = split2[1].substring(1, split2[1].length()-1); //4.把part里面的内容写到服务器 的路径上 part.write(realPath+"/"+fileName); }
3.登录案例
代码实现过程
[1]搭建服务器程序 服务器我们使用servlet模拟
[2]搭建android客户端
public void click1(View view) { new Thread(){ @Override public void run() { try { //1.获取用户名和密码 String name = et_name.getText().toString().trim(); String pwd = et_pwd.getText().toString().trim(); //1.1 定义要访问服务器路径 这个路径一定是我们服务器自己的路径 String path = "http://192.168.126.62:8080/Login/LongServlet?name="+name+"&pwd="+pwd+""; //2.把name 和pwd提交到服务器 URL url = new URL(path); //3.获取httpurlconnection对象 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); //4.对coon进行配置 conn.setConnectTimeout(5000); //设置连接 超时时间 conn.setRequestMethod("GET"); //设置请求方式 //5.获取服务器返回的状态码 int code = conn.getResponseCode(); if (code == 200){ //6获取服务器返回的数据 InputStream is = conn.getInputStream(); //服务器返回的数据是什么? //7把流里面的数据读取出来 . String content = StreamUtils.readStream(is); //8.更新UI showToast(content); } } catch (Exception e) { e.printStackTrace(); } } }.start(); }
[3]通过post方式提交数据
post是以请求体的形式提交数据
//点击按钮以post形式提交 public void click2(View view) { new Thread(){ @Override public void run() { try { //1.获取用户名和密码 String name = et_name.getText().toString().trim(); String pwd = et_pwd.getText().toString().trim(); //1.0 定义请求体 格式通过抓包抓出来 String data = "name="+name+"&pwd="+pwd+""; //1.1 定义要访问服务器路径 这个路径一定是我们服务器自己的路径 ☆☆☆路径不一样 String path = "http://192.168.126.62:8080/Login/LongServlet"; //2.把name 和pwd提交到服务器 URL url = new URL(path); //3.获取httpurlconnection对象 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); //4.对coon进行配置 conn.setConnectTimeout(5000); //设置连接 超时时间 conn.setRequestMethod("POST"); //设置请求方式 ☆☆☆请求的方式不一样 //4.1 数据是以请求体的形式提交 所以要先封装请求体(已经封装好 ) 把请求体的内容写给服务器 conn.setDoOutput(true); //允许conn对象向服务器写数据 ☆☆☆设置dooutput方法 conn.getOutputStream().write(data.getBytes()); //☆☆☆通过字节流把数据写给服务器 //5.获取服务器返回的状态码 int code = conn.getResponseCode(); if (code == 200){ //6获取服务器返回的数据 InputStream is = conn.getInputStream(); //服务器返回的数据是什么? //7把流里面的数据读取出来 . String content = StreamUtils.readStream(is); //8.更新UI showToast(content); } } catch (Exception e) { e.printStackTrace(); } } }.start(); }
4.httpclient实现get和post提交
代码实现过程
1.到包 compile ‘com.loopj.android:android-async-http:1.4.9’ 把这个包导入到build.gradle里
2.httlclient实现get提交数据
public void click1(View view) { new Thread(){ @Override public void run() { try { //1.获取用户名和密码 String name = et_name.getText().toString().trim(); String pwd = et_pwd.getText().toString().trim(); //1.1 定义要访问服务器路径 这个路径一定是我们服务器自己的路径 String path = "http://192.168.126.62:8080/Login/LongServlet?name="+name+"&pwd="+pwd+""; //1.2 使用httpclient方式实现数据提交 //base simple ... defaule... HttpClient client = new DefaultHttpClient(); //1.3 创建get对象 用来实现get请求 HttpGet get = new HttpGet(path); //1.4 实现向服务器发送请求(get post) HttpResponse response = client.execute(get); //1.5 获取响应码 响应码 是在哪里:在响应行里 int code = response.getStatusLine().getStatusCode(); if (code == 200){ //1.6 获取服务器返回的数据 InputStream is = response.getEntity().getContent(); //1.7 把流转换为String String content = StreamUtils.readStream(is); showToast(content); } } catch (Exception e) { e.printStackTrace(); } } }.start(); }
3.使用httpclient实现post提交
public void click2(View view) { new Thread(){ @Override public void run() { try { //1.获取用户名和密码 String name = et_name.getText().toString().trim(); String pwd = et_pwd.getText().toString().trim(); //2.定义请求路径 String path = "http://192.168.126.62:8080/Login/LongServlet"; //3.创建httpclient实例 HttpClient client = new DefaultHttpClient(); //4.1创建一个httppost请求 HttpPost post = new HttpPost(path); //4.2 创建parameters用来封装请求体的内容 List<NameValuePair> parameters = new ArrayList<>(); //4.3参数1 也和你服务器 request.getparameter参数对应 BasicNameValuePair nameValuePair = new BasicNameValuePair("name",name); BasicNameValuePair pwdValuePair = new BasicNameValuePair("pwd",pwd); //4.4把nameValuePair 和 pwdValuePair 加入到集合 parameters.add(nameValuePair); parameters.add(pwdValuePair); //4.5构造UrlEncodedFormEntity UrlEncodedFormEntity entity = new UrlEncodedFormEntity(parameters); //4.6 封装请求体 post.setEntity(entity); HttpResponse response = client.execute(post); //5.获取服务器返回状态码 int code = response.getStatusLine().getStatusCode(); if (code == 200){ //6 获取服务器返回的数据 InputStream is = response.getEntity().getContent(); // 把流转换为String String content = StreamUtils.readStream(is); showToast(content); } } catch (Exception e) { e.printStackTrace(); } } }.start(); }
5.asynchttpclient
get:提交代码
AsyncHttpClient client = new AsyncHttpClient(); //3.执行get请求 client.get(path, new AsyncHttpResponseHandler() { //请求成功 // 登录成功 @Override public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { Toast.makeText(MainActivity3.this, new String(responseBody), Toast.LENGTH_SHORT).show(); } //请求失败 @Override public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) { } });
post:提交代码实现
AsyncHttpClient client = new AsyncHttpClient(); //3.1 封装请求体 参数1:应该和服务器获取数据对应的key 一样 RequestParams params = new RequestParams(); params.put("name", name); params.put("pwd", pwd); //4.进行post请求 封装请求体 client.post(path, params, new AsyncHttpResponseHandler() { @Override public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { Toast.makeText(MainActivity3.this, new String(responseBody), Toast.LENGTH_SHORT).show(); } @Override public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) { } });
6.文件下载
[1]画UI
[2]根据UI写对应的逻辑
{ new Thread(){ @Override public void run() { try { //1.获取用户输入的路径 String path = et_path.getText().toString().trim(); //2.根据path去服务器下载文件 URL url = new URL(path); //3.获取httpurlconnection对象 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); //4.对coon进行配置 conn.setConnectTimeout(5000); //设置连接 超时时间 conn.setRequestMethod("GET"); //设置请求方式 //5.获取服务器返回的状态码 int code = conn.getResponseCode(); if (code == 200){ //5.1 获取要下载文件的大小 int length = conn.getContentLength(); //5.2 设置进度条最大值 pb.setMax(length); //6. 获取服务器返回的数据 InputStream is = conn.getInputStream(); //服务器返回的数据是什么? feiq的数据 //7.把流里面的数据读取出来 写到文件中--->由于我们要实现断点续传逻辑 //rw 代表读写模式 文件名也不能写死. 根据下载的路径获取文件名 RandomAccessFile raf = new RandomAccessFile(getFileName(path),"rw");// raf.seek(0); //8.流对接 int len = 0; //9.定义一个变量 记录当前线程下载的位置 int total = 0; byte[] buf = new byte[1024]; while ((len = is.read(buf))!=-1){ //9.1更新当前线程下载的位置 就是进度条的当前位置 total+=len; //9.2 更新进度条 //进度条可以在子线程更新UI 与进度相关的控件都可以在在线程更新UI. pb.setProgress(total); //10.把读取数据写到文件中 raf.write(buf,0,len); } is.close(); raf.close(); } } catch (Exception e) { e.printStackTrace(); } } }.start(); }
[3]记录当前线程下载的位置
if (isStop){ //暂停下载 把当前线程下载的位置记录一下 把total位置记录一下 .txt文件中 RandomAccessFile raff = new RandomAccessFile(getFileName(path)+".txt","rw"); raff.write(String.valueOf(total).getBytes()); raff.close(); break; }
[4]判断是否下载过 如果下载过继续上次的位置继续下
if (file.exists() && file.length()>0){ //4.2 把上次记录的位置取出来 FileInputStream fis = new FileInputStream(file); BufferedReader bufr = new BufferedReader(new InputStreamReader(fis)); String lastDownLoadPosition = bufr.readLine(); //上次下载的位置 startIndex = Integer.parseInt(lastDownLoadPosition); //4.3 通过range头 告诉服务器 下次我在获取数据的时候 从lastDownLoadPosition位置获取数据 conn.setRequestProperty("range","bytes="+ startIndex +"-"); //4.4 关闭流 bufr.close(); }
[5]判断文件是否下载完成 如果下载完成 把.txt文件删除
//11.判断文件是否下载完成 如果文件下载ok 把.txt文件删除. if (total == length){ File deleteFile = new File(getFileName(path)+".txt"); deleteFile.delete(); runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(MainActivity.this, "下载ok", Toast.LENGTH_SHORT).show(); } }); }
软件中存在的bug 谷歌市场 模块 专门讲下载
1.我们把软件下载到data/data目录 sd卡. 用户手机没有sd卡.
2.做屏幕适配
3.应该加上:判断当前用户网络状态是否是wifi状态.
4.下载文件在服务器上放着,有些文件可能是病毒文件.
………
7.通过开源项目实现文件下载
xutils.
{ //1.获取要下载文件的路径 http://192.168.126.62:8080/fei.exe String path = et_path.getText().toString().trim(); //2. xutils开源项目实现下载 HttpUtils httpUtils = new HttpUtils(); //3.调用下载方法 参数2:指定下载的文件存储目录 //参数3:是否支持断点续传 httpUtils.download(path, getFileName(path), true, new RequestCallBack<File>() { //当下载成功的时候 @Override public void onSuccess(ResponseInfo<File> responseInfo) { Toast.makeText(getApplicationContext(),"sucess",Toast.LENGTH_LONG).show(); } //更新进度条 进度条的最大值 和 当前进度条 @Override public void onLoading(long total, long current, boolean isUploading) { pb.setMax((int)total); //设置进度条条最大值 pb.setProgress((int)current); } //下载失败 @Override public void onFailure(HttpException error, String msg) { } }); }
- Java网络编程2
- java网络编程2
- 网络编程基础(2)
- java网络编程2
- java网络编程(2)
- 网络编程笔记2
- 网络编程2
- 网络编程(2)
- 网络编程2
- 网络编程笔记<2>
- socket网络编程2
- 网络编程总结 2
- 网络编程2
- Java_网络编程2
- 网络编程2
- boost网络编程(2)
- 网络编程 (2)
- 网络编程2
- NYOJ-709-异形卵
- Find TwoBee 寻找小蜜蜂
- Verilog HDL-1
- Hive SQL 数据去重简析
- linux服务器部署应用程序
- 网络编程2
- 时钟
- 算法初探
- 八大排序
- 关于linux USB WIFI 的一些内容
- Ubuntu 16.04下安装Bunlder和PMVS(CMVS)---很重要
- 回文(字符串)
- 如何编写更好的sql查询
- 《Clair二次开发指南1——Clair编译与使用》