网络编程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) {​            }        });​    }