zoukankan      html  css  js  c++  java
  • 网络编程:Http通信与Socket通信

    http://note.youdao.com/share/?id=f14d304548003f65e34255d3ddf9df31&type=note
    网络编程:Http通信与Socket通信(移动互联核心)
    知识点概述:
    1.Socket通信:面向连接(TCP)和无连接的(UDP)
    2.HttpURLConnection 接口:Get和Post方式
    3.HttpClient接口:Get和Post方式
     
    知识点详述:
    1 Socket通信
    Socket称为”套接字“,用于描述IP地址和端口,它是支持TCP/IP协议的网络通信的基本操作单元。有两种主要的操作方式:面向连接(TCP协议)和无连接(UDP协议)的。面向连接的操作比无连接操作的效率更低,但是数据的安全性更高。
    OSI七层模型
    TCP与UDP区别:

    TCP---传输控制协议,提供的是面向连接、可靠的字节流服务,传输数据前经过“三次握手”建立连接,保证数据传输的可靠性,但效率比较低。一般用于对于数据传输安全性较高的场合。

    UDP---用户数据报协议,是一个简单的面向数据报的运输层协议,面向无连接。UDP不提供可靠性,数据传输可能发生错序,丢包,但效率较高。一般用于对于实时性要求较高的场合。

     
    Android Socket编程
      (1)服务器实现步骤:
      指定端口实例化一个ServerSocket                                                               1. 实例化ServerSocket实例,指定端口号
      调用ServerSocket的accept()以在等待连接期间造成阻塞                        2. 调用accept方法,等待客户端请求
      获取位于该底层Socket的流以进行读写操作                                                 3. 有请求则返回Socket连接实例
      将数据封装成流                                                                                            4. 通过Socket获取输入流读取请求数据,并获得输出流做出响应
      对Socket进行读写                                                                                        5.关闭流
      关闭打开的流
     
     ServerSocket ss = null;
      // 创建一个ServerSocket,监听一个端口号
      try {
       ss = new ServerSocket(8080);
       // 等待一个socket连接
       Socket s = ss.accept();
       // 缓冲读取数据类
       BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
       // 从流中读取一行数据
       String msgFromClient = br.readLine();
       System.out.println("msgFromClient:" + msgFromClient);
       // 参数2:true 表示数据自动刷新
       PrintWriter pw = new PrintWriter(new OutputStreamWriter(s.getOutputStream()), true);
       pw.println("接受到了!");
       //刷新数据
         pw.flush();
               
      } catch (IOException e) {
       e.printStackTrace();
      }
     
      (2)客户端实现步骤:
      通过IP地址和端口实例化Socket,请求连接服务器                   1.实例化Socket实例,指定服务端ip,以及服务端监听此服务的端口号
      获取Socket上的流以进行读写                                                  2. 通过Socket获取输出流向服务端发送消息
      把流包装进BufferedReader/PrintWriter的实例                      3.再通过Socket获取输入流读取服务端响应数据
      对Socket进行读写                                                                    4.关闭流
      关闭打开的流
     
    Socket s = null;
      try {
       //和服务器断建立连接
       s = new Socket("127.0.0.1", 8080);
       //将输出流输出
       PrintWriter pw = new PrintWriter(new OutputStreamWriter(s.getOutputStream()));
       pw.println("我是客户端,我给你一些数据");
       // 刷新提交过去
       pw.flush();
       //接收客户端的消息
       BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
       String msgFromServer = br.readLine();
       System.out.println("msgFromServer:" + msgFromServer);
      } catch (UnknownHostException e) {
       e.printStackTrace();
      } catch (IOException e) {
       e.printStackTrace();
      }
     
     
    前序:HTTP通信 (B/S, C/S)
    HTTP(超文本传输协议)用于传送www方式的数据,采用了请求/响应模型。客户端向服务器发送一个请求,请求头包含了请求的方法、URI、协议版本,以及包含请求修饰符、
    客户信息和内容的类似于MIME的消息结构。服务器以一个状态行作为响应,响应的内容包括消息协议的版本、成功或者错误编码,还包含服务器信息、实体元信息以及可能的实体内容。它是一个属于应用层的面向对象的协议,由于其简洁、快速,它适用于分布式超媒体信息系统。在internet上,http通信通常发生在TCP/IP连接之上,缺省端口是TCP 80,但其他的端口也是可用的。这并不预示着http协议在internet或其它网络的其他协议之上才能完成,http只预示着一个可靠地传输。Android提供了HttpURLConnection和HttpClient接口来开发http程序。
    2.HttpURLConnection 接口 java.net.*提供
    HTTP通信中使用最多的就是Get和Post,Get请求可以获取静态页面,也可以把参数放在URL字符串后面,传递给服务器。Post与Get的不同之处在于Post的参数不是放在URL字符串里面,而是放在http请求数据中。HttpURLConnection是Java的标准类,继承自URLConnection类,两个类都是抽象类,无法直接实例化对象。其对象主要通过URL的openConnection方法获得。每次openConnection都将创建一个新的连接实例,在连接之前我们可以对其一些属性进行设置,比如超时时间等:
    connection.setDoOutput(true); //设置输入流(Post时必须设置)
    connection.setDoInput(true); // 设置输出流(Post时必须设置)
    connection.setRequestMethod("POST"); // 设置方式为POST(Post时必须设置)
    connection.setInstanceFollowRedirects(true); //设置该请求是否重定向
    connection.disconnect(); //关闭HttpURLConnection连接
    connection.setConnectionTimeout(int time); //设置连接超时
    connection.setReadTimeout(int time); //设置读取超时
    注:如果使用post方式,还需要设置请求的Content-Type
    connection.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
     
     
     
    3. HttpClient接口(Apache接口,包名:org.apache.http.*),需要了解一些类:
       HttpClient实现移动互联的步骤,以及需要的类:
    1) 封装请求  HttpGet / HttpPost
    2) 封装连接参数 HttpParams--》BasicHttpParams, HttpConnectionParams
    注:如果是Get方式则省略3)4)步骤
    3)封装请求参数 NameValuePair--》BasicNameValuePair--》List<NameValuePair>-->HttpEntity-->UrlEncodedFormEntity
    4 )  设置请求参数   HttpPost-->setEntity(请求参数)
    5) 封装执行请求的客户端实例并且设置连接参数  HttpClient--》DefaultHttpClient(HttpParams)
    6)发送请求,接收响应  client.execute(HttpGet/HttpPost)--->HttpResponse
    7 ) 判断响应码是否是200,如果正常则接收响应数据  resp.getStatusLine().getStatusCode()-->200-->getEntity()-->HttpEntity
    8 ) 根据响应数据类型进行转换   
    (图片--》HttpEntity.getConent()-->InputStream--->BitmapFactory.decodeStream())
     (文本--》EntityUtils.toString(HttpEntity, "utf-8")
     
     
    (1)HttpClient使用Get方式获取数据,需要使用HttpGet来构建一个Get方式的http请求,然后通过HttpClient来执行这个请求,HttpResponse在接收这个请求后给出响应,最后通过“HttpResponse.getStatusLine().getStatusCode()"来判断请求是否成功,并处理。可以直接使用如下方法将响应的实体元信息转化为字符串
    String strResult = EntityUtils.toString(httpResponse.getEntity());
    HttpClient的Get方式请求步骤:
    封装HttpGet请求 new HttpGet(urlStr)
          通过HttpParams设置连接参数
    获取HttpClient实例  new DefaultHttpClient();
    发送请求,接收响应
          HttpResponse = httpClient.excute(httpGet)
    判断响应码是不是200.如果是200,接收响应数据
    HttpEntity  = httpResponse.getEntity();
     
    HttpClient使用Post方式获取数据稍微复杂一点。首先好使用HttpPost来构建一个Post方式的http请求,
    HttpPost httpRequest=new HttpPost("url");
    需要使用NameValuePair来保存要传递的参数,可以使用BasicNameValuePair来构造一个要被传递的参数,然后通过add方法添加这个参数到NameValuePair中,
    List<NameValuePair> params=new ArrayList<NameValuePair>();  //使用NameValuePair来保存要传递的Post参数
    params.add(new BasicNameValuePair("par","HttpClient_android_Post"));  
    //添加要传递的参数Post方式还需要设置所使用的字符集,最后就和Get方式一样通过HttpClient来请求这个连接,返回响应并处理,
    HttpEntity httpentity=new UrlEncodedFormEntity(params,"utf-8");  //设置字符集
    httpRequest.setEntity(httpentity);  //为请求设置实体元信息
    (2)DefaultHttpClient是默认的一个HTTP客户端,我们可以使用它创建一个HTTP连接。
    代码如下:HttpClient hc=new DefaultHttpClient();
    (3) HttpResponse是一个HTTP连接响应,当执行一个http连接后,就会返回一个HttpResponse,可以通过其获得一些响应信息。下面是请求一个HTTP连接并获得该请求是否成功的代码:
    HttpResponse hresponse=hc.execute(httpRequest);
    if(hresponse.getStatusLine().getStatusCode()==HttpStatus.SC_OK){ //连接成功
    }
    示例代码:
    //HttpClient接口通过Post方式获取数据
    private String requestStringGet(String urlStr, String param){
    String content = "";
    //构建Post请求
    HttpPost request = new HttpPost(urlStr);
    //构建设置连接参数实例
    HttpParams connParams = new BasicHttpParams();
    //设置连接超时
    HttpConnectionParams.setConnectionTimeout(connParams, 10 * 1000);
    //设置Socket超时
    HttpConnectionParams.setSoTimeout(connParams, 10 * 1000);
    //构建请求参数
    List<NameValuePair> requestParams = new ArrayList<NameValuePair>();
    requestParams.add(new BasicNameValuePair("name", param));
    requestParams.add(new BasicNameValuePair("pass", param));
    try{
    //将请求参数列表转化为请求实体元信息
    HttpEntity paramEntity = new UrlEncodedFormEntity(requestParams,"utf-8");
    //将请求实体元信息设置到请求中
    request.setEntity(paramEntity);
    //获取执行请求的HttpClient
    HttpClient client = new DefaultHttpClient(connParams);
     
    //执行请求,获取响应
    HttpResponse response = client.execute(request);
    //判断是否正确响应
    if(response.getStatusLine().getStatusCode() == 200){
    //获取响应内容
    HttpEntity entity = response.getEntity();
    if(entity!=null){
    content = EntityUtils.toString(entity, "utf-8");
    Log.d("TAG", "content: " + content);
    content = parseJson(content).toString();
    }else{
    content = "服务器没有给出响应内容";
    }
    }else{
    content = "获取响应失败!";
    }
     
    }catch(SocketTimeoutException e){
    Toast.makeText(this, "请求超时!", Toast.LENGTH_LONG).show();
    }catch(IOException e){
    e.printStackTrace();
    Toast.makeText(this, "网络连接出错!", Toast.LENGTH_LONG).show();
    }
    return content;
    }
     
     如何避免ANR:
    Thread + Handler
    AsyncTask
     
    关于Handler:
     
    关于AsyncTask:

    AsyncTask:异步任务类<----------------------->handler

    //如果我有耗时工作,并且耗时工作结束之后要更新UI

    异步任务的泛型类型

    AsynTask<参数,进度条参数,返回值>

    启动异步任务类:  调用  execute(参数); //不定长参数

    当调用execute的时候执行 doInBackground(参数)

    doInBackground方法在子线程执行,当其执行完毕后返回返回值,

    然后执行onPostExe
     
    扩展: 网络通信的中文乱码问题
    网络通信中,产生乱码的原因主要是通信过程中使用了不同的编码方式:服务器中的编码方式,传输过程中的编码方式,传输到达中断设备的编码方式。因此在传输过程中就需要至少两次编码转换:首先从服务器编码转换为网络编码,再从网络编码转换为终端设备编码。在转换过程中发生任何情况都可能引起编码混乱,一般情况下我们可以通过以下两种方式来避免这个问题。
    一种方式是:由于大部分终端设备都支持Unicode字符集,所以在连接网页时,我们希望网页数据在网络传输时使用utf-8方式传输,这样就可以很简单地将utf-8转换成
    Unicode字符集了。
    另一种方式是在数据传递过程中使用ISO-8859-1字符集,这样就是直接使用ASCII编码方式,当然在传递到终端设备时,需要将其数据反转才能够正常显示。归根结底,解决中文乱码只需要两个步骤:
    使用getBytes("编码方式");来对汉字进行重编码,得到它的字节数组
    再使用new String(Bytes[],"解码方式");来对字节数组进行相应的解码
     
    作业描述:
    访问服务器文件内容并通过TextView将内容显示出来
    要求:1. 访问data.xml文件用HttpUrlConnection实现,通过Thread + Handler优化性能,要求必须设置超时连接参数,注意编码规范
               2. 访问data.json文件用HttpClient实现,通过AsyncTask优化性能,要求必须设置超时连接参数,注意编码规范
    http://note.youdao.com/share/?id=f14d304548003f65e34255d3ddf9df31&type=note
    网络编程:Http通信与Socket通信(移动互联核心)
    知识点概述:
    1.Socket通信:面向连接(TCP)和无连接的(UDP)
    2.HttpURLConnection 接口:Get和Post方式
    3.HttpClient接口:Get和Post方式
     
    知识点详述:
    1 Socket通信
    Socket称为”套接字“,用于描述IP地址和端口,它是支持TCP/IP协议的网络通信的基本操作单元。有两种主要的操作方式:面向连接(TCP协议)和无连接(UDP协议)的。面向连接的操作比无连接操作的效率更低,但是数据的安全性更高。
    OSI七层模型
    TCP与UDP区别:

    TCP---传输控制协议,提供的是面向连接、可靠的字节流服务,传输数据前经过“三次握手”建立连接,保证数据传输的可靠性,但效率比较低。一般用于对于数据传输安全性较高的场合。

    UDP---用户数据报协议,是一个简单的面向数据报的运输层协议,面向无连接。UDP不提供可靠性,数据传输可能发生错序,丢包,但效率较高。一般用于对于实时性要求较高的场合。

     
    Android Socket编程
      (1)服务器实现步骤:
      指定端口实例化一个ServerSocket                                                               1. 实例化ServerSocket实例,指定端口号
      调用ServerSocket的accept()以在等待连接期间造成阻塞                        2. 调用accept方法,等待客户端请求
      获取位于该底层Socket的流以进行读写操作                                                 3. 有请求则返回Socket连接实例
      将数据封装成流                                                                                            4. 通过Socket获取输入流读取请求数据,并获得输出流做出响应
      对Socket进行读写                                                                                        5.关闭流
      关闭打开的流
     
     ServerSocket ss = null;
      // 创建一个ServerSocket,监听一个端口号
      try {
       ss = new ServerSocket(8080);
       // 等待一个socket连接
       Socket s = ss.accept();
       // 缓冲读取数据类
       BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
       // 从流中读取一行数据
       String msgFromClient = br.readLine();
       System.out.println("msgFromClient:" + msgFromClient);
       // 参数2:true 表示数据自动刷新
       PrintWriter pw = new PrintWriter(new OutputStreamWriter(s.getOutputStream()), true);
       pw.println("接受到了!");
       //刷新数据
         pw.flush();
               
      } catch (IOException e) {
       e.printStackTrace();
      }
     
      (2)客户端实现步骤:
      通过IP地址和端口实例化Socket,请求连接服务器                   1.实例化Socket实例,指定服务端ip,以及服务端监听此服务的端口号
      获取Socket上的流以进行读写                                                  2. 通过Socket获取输出流向服务端发送消息
      把流包装进BufferedReader/PrintWriter的实例                      3.再通过Socket获取输入流读取服务端响应数据
      对Socket进行读写                                                                    4.关闭流
      关闭打开的流
     
    Socket s = null;
      try {
       //和服务器断建立连接
       s = new Socket("127.0.0.1", 8080);
       //将输出流输出
       PrintWriter pw = new PrintWriter(new OutputStreamWriter(s.getOutputStream()));
       pw.println("我是客户端,我给你一些数据");
       // 刷新提交过去
       pw.flush();
       //接收客户端的消息
       BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
       String msgFromServer = br.readLine();
       System.out.println("msgFromServer:" + msgFromServer);
      } catch (UnknownHostException e) {
       e.printStackTrace();
      } catch (IOException e) {
       e.printStackTrace();
      }
     
     
    前序:HTTP通信 (B/S, C/S)
    HTTP(超文本传输协议)用于传送www方式的数据,采用了请求/响应模型。客户端向服务器发送一个请求,请求头包含了请求的方法、URI、协议版本,以及包含请求修饰符、
    客户信息和内容的类似于MIME的消息结构。服务器以一个状态行作为响应,响应的内容包括消息协议的版本、成功或者错误编码,还包含服务器信息、实体元信息以及可能的实体内容。它是一个属于应用层的面向对象的协议,由于其简洁、快速,它适用于分布式超媒体信息系统。在internet上,http通信通常发生在TCP/IP连接之上,缺省端口是TCP 80,但其他的端口也是可用的。这并不预示着http协议在internet或其它网络的其他协议之上才能完成,http只预示着一个可靠地传输。Android提供了HttpURLConnection和HttpClient接口来开发http程序。
    2.HttpURLConnection 接口 java.net.*提供
    HTTP通信中使用最多的就是Get和Post,Get请求可以获取静态页面,也可以把参数放在URL字符串后面,传递给服务器。Post与Get的不同之处在于Post的参数不是放在URL字符串里面,而是放在http请求数据中。HttpURLConnection是Java的标准类,继承自URLConnection类,两个类都是抽象类,无法直接实例化对象。其对象主要通过URL的openConnection方法获得。每次openConnection都将创建一个新的连接实例,在连接之前我们可以对其一些属性进行设置,比如超时时间等:
    connection.setDoOutput(true); //设置输入流(Post时必须设置)
    connection.setDoInput(true); // 设置输出流(Post时必须设置)
    connection.setRequestMethod("POST"); // 设置方式为POST(Post时必须设置)
    connection.setInstanceFollowRedirects(true); //设置该请求是否重定向
    connection.disconnect(); //关闭HttpURLConnection连接
    connection.setConnectionTimeout(int time); //设置连接超时
    connection.setReadTimeout(int time); //设置读取超时
    注:如果使用post方式,还需要设置请求的Content-Type
    connection.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
     
     
     
    3. HttpClient接口(Apache接口,包名:org.apache.http.*),需要了解一些类:
       HttpClient实现移动互联的步骤,以及需要的类:
    1) 封装请求  HttpGet / HttpPost
    2) 封装连接参数 HttpParams--》BasicHttpParams, HttpConnectionParams
    注:如果是Get方式则省略3)4)步骤
    3)封装请求参数 NameValuePair--》BasicNameValuePair--》List<NameValuePair>-->HttpEntity-->UrlEncodedFormEntity
    4 )  设置请求参数   HttpPost-->setEntity(请求参数)
    5) 封装执行请求的客户端实例并且设置连接参数  HttpClient--》DefaultHttpClient(HttpParams)
    6)发送请求,接收响应  client.execute(HttpGet/HttpPost)--->HttpResponse
    7 ) 判断响应码是否是200,如果正常则接收响应数据  resp.getStatusLine().getStatusCode()-->200-->getEntity()-->HttpEntity
    8 ) 根据响应数据类型进行转换   
    (图片--》HttpEntity.getConent()-->InputStream--->BitmapFactory.decodeStream())
     (文本--》EntityUtils.toString(HttpEntity, "utf-8")
     
     
    (1)HttpClient使用Get方式获取数据,需要使用HttpGet来构建一个Get方式的http请求,然后通过HttpClient来执行这个请求,HttpResponse在接收这个请求后给出响应,最后通过“HttpResponse.getStatusLine().getStatusCode()"来判断请求是否成功,并处理。可以直接使用如下方法将响应的实体元信息转化为字符串
    String strResult = EntityUtils.toString(httpResponse.getEntity());
    HttpClient的Get方式请求步骤:
    封装HttpGet请求 new HttpGet(urlStr)
          通过HttpParams设置连接参数
    获取HttpClient实例  new DefaultHttpClient();
    发送请求,接收响应
          HttpResponse = httpClient.excute(httpGet)
    判断响应码是不是200.如果是200,接收响应数据
    HttpEntity  = httpResponse.getEntity();
     
    HttpClient使用Post方式获取数据稍微复杂一点。首先好使用HttpPost来构建一个Post方式的http请求,
    HttpPost httpRequest=new HttpPost("url");
    需要使用NameValuePair来保存要传递的参数,可以使用BasicNameValuePair来构造一个要被传递的参数,然后通过add方法添加这个参数到NameValuePair中,
    List<NameValuePair> params=new ArrayList<NameValuePair>();  //使用NameValuePair来保存要传递的Post参数
    params.add(new BasicNameValuePair("par","HttpClient_android_Post"));  
    //添加要传递的参数Post方式还需要设置所使用的字符集,最后就和Get方式一样通过HttpClient来请求这个连接,返回响应并处理,
    HttpEntity httpentity=new UrlEncodedFormEntity(params,"utf-8");  //设置字符集
    httpRequest.setEntity(httpentity);  //为请求设置实体元信息
    (2)DefaultHttpClient是默认的一个HTTP客户端,我们可以使用它创建一个HTTP连接。
    代码如下:HttpClient hc=new DefaultHttpClient();
    (3) HttpResponse是一个HTTP连接响应,当执行一个http连接后,就会返回一个HttpResponse,可以通过其获得一些响应信息。下面是请求一个HTTP连接并获得该请求是否成功的代码:
    HttpResponse hresponse=hc.execute(httpRequest);
    if(hresponse.getStatusLine().getStatusCode()==HttpStatus.SC_OK){ //连接成功
    }
    示例代码:
    //HttpClient接口通过Post方式获取数据
    private String requestStringGet(String urlStr, String param){
    String content = "";
    //构建Post请求
    HttpPost request = new HttpPost(urlStr);
    //构建设置连接参数实例
    HttpParams connParams = new BasicHttpParams();
    //设置连接超时
    HttpConnectionParams.setConnectionTimeout(connParams, 10 * 1000);
    //设置Socket超时
    HttpConnectionParams.setSoTimeout(connParams, 10 * 1000);
    //构建请求参数
    List<NameValuePair> requestParams = new ArrayList<NameValuePair>();
    requestParams.add(new BasicNameValuePair("name", param));
    requestParams.add(new BasicNameValuePair("pass", param));
    try{
    //将请求参数列表转化为请求实体元信息
    HttpEntity paramEntity = new UrlEncodedFormEntity(requestParams,"utf-8");
    //将请求实体元信息设置到请求中
    request.setEntity(paramEntity);
    //获取执行请求的HttpClient
    HttpClient client = new DefaultHttpClient(connParams);
     
    //执行请求,获取响应
    HttpResponse response = client.execute(request);
    //判断是否正确响应
    if(response.getStatusLine().getStatusCode() == 200){
    //获取响应内容
    HttpEntity entity = response.getEntity();
    if(entity!=null){
    content = EntityUtils.toString(entity, "utf-8");
    Log.d("TAG", "content: " + content);
    content = parseJson(content).toString();
    }else{
    content = "服务器没有给出响应内容";
    }
    }else{
    content = "获取响应失败!";
    }
     
    }catch(SocketTimeoutException e){
    Toast.makeText(this, "请求超时!", Toast.LENGTH_LONG).show();
    }catch(IOException e){
    e.printStackTrace();
    Toast.makeText(this, "网络连接出错!", Toast.LENGTH_LONG).show();
    }
    return content;
    }
     
     如何避免ANR:
    Thread + Handler
    AsyncTask
     
    关于Handler:
     
    关于AsyncTask:

    AsyncTask:异步任务类<----------------------->handler

    //如果我有耗时工作,并且耗时工作结束之后要更新UI

    异步任务的泛型类型

    AsynTask<参数,进度条参数,返回值>

    启动异步任务类:  调用  execute(参数); //不定长参数

    当调用execute的时候执行 doInBackground(参数)

    doInBackground方法在子线程执行,当其执行完毕后返回返回值,

    然后执行onPostExe
     
    扩展: 网络通信的中文乱码问题
    网络通信中,产生乱码的原因主要是通信过程中使用了不同的编码方式:服务器中的编码方式,传输过程中的编码方式,传输到达中断设备的编码方式。因此在传输过程中就需要至少两次编码转换:首先从服务器编码转换为网络编码,再从网络编码转换为终端设备编码。在转换过程中发生任何情况都可能引起编码混乱,一般情况下我们可以通过以下两种方式来避免这个问题。
    一种方式是:由于大部分终端设备都支持Unicode字符集,所以在连接网页时,我们希望网页数据在网络传输时使用utf-8方式传输,这样就可以很简单地将utf-8转换成
    Unicode字符集了。
    另一种方式是在数据传递过程中使用ISO-8859-1字符集,这样就是直接使用ASCII编码方式,当然在传递到终端设备时,需要将其数据反转才能够正常显示。归根结底,解决中文乱码只需要两个步骤:
    使用getBytes("编码方式");来对汉字进行重编码,得到它的字节数组
    再使用new String(Bytes[],"解码方式");来对字节数组进行相应的解码
     
    作业描述:
    访问服务器文件内容并通过TextView将内容显示出来
    要求:1. 访问data.xml文件用HttpUrlConnection实现,通过Thread + Handler优化性能,要求必须设置超时连接参数,注意编码规范
               2. 访问data.json文件用HttpClient实现,通过AsyncTask优化性能,要求必须设置超时连接参数,注意编码规范
  • 相关阅读:
    CoCreateInstace 返回未知注册类别错误
    WINCE USB驱动组入
    CreateEvent ResetEvent SetEvent
    AppWidget的范例
    ubuntu下解决无声音的方法
    计算几何与图形学有关的几种常用算法
    Android实现GPS的打开与关闭
    深入剖析Android动画(Animation) (闪烁、左右摇摆、上下晃动等效果)
    中兴手机Linux下开发的方法
    移动网络环境下ReadBuffer的使用
  • 原文地址:https://www.cnblogs.com/pastor/p/5077847.html
Copyright © 2011-2022 走看看