网络和I/O

一、网络HttpURLConnection 类

HttpURLConnection 类是基于HTTP协议的,其底层是通过Socket实现的。

URL请求的类别:
分为二类,GET与POST请求。二者的区别在于:
a:) get请求可以获取静态页面,也可以把参数放在URL字串后面,传递给servlet,
b:) post与get的不同之处在于post的参数不是放在URL字串里面,而是放在http请求的正文内。
这里写图片描述

Http协议支持的操作有GET、POST、HEAD、PUT、TRACE、OPTIONS、DELETE,其中最最常用的还是GET和POST操作,下面我们看一下GET和POST的区别。

GET:
GET请求可以被缓存。 我们之前提到,当发送键值对信息时,可以在URL上面直接追加键值对参数。当用GET请求发送键值对时,键值对会随着URL一起发送的。 由于GET请求发送的键值对时随着URL一起发送的,所以一旦该URL被黑客截获,那么就能看到发送的键值对信息,所以GET请求的安全性很低,不能用GET请求发送敏感的信息(比如用户名密码)。 由于URL不能超过2048个字符,所以GET请求发送数据是有长度限制的。 由于GET请求较低的安全性,我们不应该用GET请求去执行增加、删除、修改等的操作,应该只用它获取数据。

POST:
POST请求从不会被缓存。 POST请求的URL中追加键值对参数,不过这些键值对参数不是随着URL发送的,而是被放入到请求体中发送的,这样安全性稍微好一些。 应该用POST请求发送敏感信息,而不是用GET。 由于可以在请求体中发送任意的数据,所以理论上POST请求不存在发送数据大小的限制。 当执行增减、删除、修改等操作时,应该使用POST请求,而不应该使用GET请求。

a. 从客户端得到服务端数据 GET

1、 示例1,如何得到HttpURLConnection 类,及使用它的各种方法,得到输入流。

  URL url=new URL(urlString);

  HttpURLConnection connection= (HttpURLConnection) url.openConnection();
//            链接超时时间
     connection.setConnectTimeout(30000);
     connection.setRequestMethod("GET");
//           开始请求
     connection.connect();
//          请求的状态码,200是成功,404等
     int responseCode=connection.getResponseCode();
     String responseMessage=connection.getResponseMessage();


     String result=null;
     if(responseCode==HttpURLConnection.HTTP_OK){
        InputStream inputStream=connection.getInputStream();

示例2,如何得到HttpURLConnection 类,及使用它的各种方法,得到输入流。

 URL url = new URL(urlString); //URL对象  

 conn = (HttpURLConnection)url.openConnection(); //使用URL打开一个链接  
 conn.setDoInput(true); //允许输入流,即允许下载  
 conn.setDoOutput(true); //允许输出流,即允许上传  
 conn.setUseCaches(false); //不使用缓冲  
 conn.setRequestMethod("GET"); //使用get请求  
 is = conn.getInputStream();   //获取输入流,此时才真正建立链接 

b.客户端向服务端发送数据 POST

 // 设置是否向httpUrlConnection输出,因为这个是post请求,参数要放在   
 2  // http正文内,因此需要设为true, 默认情况下是false;   
 3  httpUrlConnection.setDoOutput(true);   
 4   
 5  // 设置是否从httpUrlConnection读入,默认情况下是true;   
 6  httpUrlConnection.setDoInput(true);   
 7   
 8  // Post 请求不能使用缓存   
 9  httpUrlConnection.setUseCaches(false);   
10   
11  // 设定传送的内容类型是可序列化的java对象   
12  // (如果不设此项,在传送序列化对象时,当WEB服务默认的不是这种类型时可能抛java.io.EOFException)   
13  httpUrlConnection.setRequestProperty("Content-type", "application/x-java-serialized-object");   
14   
15  // 设定请求的方法为"POST",默认是GET   
16  httpUrlConnection.setRequestMethod("POST");   
17   
18  // 连接,从上述第2条中url.openConnection()至此的配置必须要在connect之前完成,   
19          httpUrlConnection.connect();  

 // 此处getOutputStream会隐含的进行connect(即:如同调用上面的connect()方法,   
 // 所以在开发中不调用上述的connect()也可以)。   
  OutputStream outStrm = httpUrlConnection.getOutputStream();

二、I/O

a.从网路得到数据输入流,从输入流解析到数据

1.a 一种解析输入流的方式

Reader reader=new InputStreamReader(inputStream,"UTF-8");
char[] buffer=new char[1024];
reader.read(buffer);

result=new String(buffer);

1.b 一种解析输入流的方式

reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));

 String strRead = null;
 while ((strRead = reader.readLine()) != null) {
     sbf.append(strRead);
     sbf.append("\r\n");
  }
  reader.close();
  result = sbf.toString();

2.解析为图片, 参数is是输入流

 // ImageView设置Bitmap,用BitMap工厂解析输入流
 mIvShow.setImageBitmap(BitmapFactory.decodeStream(is));

b.客户端向服务端发送数据,POST时 输出流

    //获取conn的输出流
    OutputStream os = conn.getOutputStream();
   //读取assets目录下的person.xml文件,将其字节数组作为请求体
    requestBody = getBytesFromAssets("person.xml");
   //将请求体写入到conn的输出流中
    os.write(requestBody);
   //记得调用输出流的flush方法
     os.flush();
   //关闭输出流
    os.close();
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值