zoukankan      html  css  js  c++  java
  • [转载]android网络通信解析

    原文地址:android网络通信解析作者:clunyes
    网络编程的目的就是直接戒间接地通过网络协议不其他计算机进行通讯。
    网络编程中有两个主要的问题,
    一个是如何准确的定位网络上一台戒多台指主机;
    另一个就是找到主机后如何可靠高效的进行数据传输。
    目前使用最广泛的因特网协议是TCP/IP协议:
    在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上的一台主机。而TCP层则提供面向应用的可靠的戒非可靠的数据传输机制,这是网络编程的主要对象,一般丌需要关心IP层是如何处理数据的。
    Android平台为网络通信提供了丰富的API,除了对Java标准平台保留的java.net、javax.net、javax.net.ssl包之外,还添加了android.net、android.net.http包。此外,Android平台还将Apache旗下的Http通信相关的org.apache.http包也纳入到系统来。下面做介绍。
    1)java.net包中主要类/接口说明
    类/接口                           说明
    ServerSocket                表示用于等待客户端连接的服务方的套接字
    Scoket                      提供一个客户端的TCP套接字
    DatagramSocket              实现一个用于发送和接收数据报德DUP套接字
    DatagramPacket              数据包
    IntetAddress                表示IP地址
    UnkownHostException         位置主机异常
    HttpURLConnection           用于管理Http链接(RFC 2068)的资源连接管理器
    URL                         用于指定互联网上1个资源的位置信息(RFC 1783)
    2)javax.net.ssl包中主要类/接口说明
    类/接口                          说明
    HttpsURLConnection          用于管理Https连接(RFC 2818)的资源连接管理器
    SSLSocket                   提供安全协议的套接字
    SSLServerSocket             基于SSL、TLS等协议的安全服务套接字
    SSLContext                  SSL上下文环境API
    TrustManagerFactory         信任管理器工厂
    KeyManagerFactory           密钥管理器工厂
    org.apacke.http.impl.client包主要类/接口说明
    类/接口                          说明
    DefaultHttpClient           表示一个Http客户端默认实现接口
    org.apacke.http.client.methods包中主要类/接口说明
    类/接口                          说明
    HttpGet /HttpPost/HttpPut/HttpHead 表示Http的各种方法
    org.apacke.http包中主要类/接口说明
    类/接口                          说明
    HttpResponse                一个Http响应
    StatusLine                  状态行
    Header                      表示Http头部字段
    HeaderElement               Http头部值中的一个元素
    NameValuesPair              封装了属性:值对的类
    HttpEntity                  一个可以同Http消息进行接收或发送的实体
    关于这方面更多地内容:参考Android的SDK
    首先介绍通过Apache提供的http包工具进行Http通信,分成两种形式:GET和POST。
    Get和POST请求主要有几种区别:
    1、Post请求可以向服务器传送数据,而且数据放在HTML HEADER内一起传送到服务端URL地址,数据对用户丌可见。而get是把参数数据队列加到提交的URL中,值和表单内各个字段一一对应,例如(http://sso.eoeandroid.com/sso.php?partner=tiangu)
    2、get 传送的数据量较小,丌能大于2KB。post传送的数据量较大,一般被默认为丌受限制。
    3、get安全性非常低,post安全性较高。
    1、首先加入权限:
    2、新建HttpClient对象,并做超时时间设置:
    HttpClienthttpClient= newDefaultHttpClient(); //新建HttpClient对象
    HttpConnectionParams.setConnectionTimeout(httpClient.getParams(), 3000); //设置连接超时
    HttpConnectionParams.setSoTimeout(httpClient.getParams(), 3000); //设置数据读取时间超时
    ConnManagerParams.setTimeout(httpClient.getParams(), 3000); //设置从连接池中取连接超时
    3、使用Get请求,并获取HttpResponse响应:
    HttpGethttpget= newHttpGet(url); //获取请求
    HttpResponseresponse = httpClient.execute(httpget); //执行请求,获取响应结果
    if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){ //响应通过
    String result= EntityUtils.toString(response.getEntity(), "UTF-8");
    }//注意做异常处理
    4、使用Post请求,并获取HttpResponse响应:
    HttpClienthttpClient= newDefaultHttpClient(); // 新建HttpClient对象
    HttpPosthttpPost= newHttpPost(url); // 新建HttpPost对象
    List params= newArrayList(); //使用NameValuePair来保存要传递的Post参数
    params.add(newBasicNameValuePair("username", "hello")); //添加要传递的参数
    params.add(newBasicNameValuePair("password", "eoe"));
    try{
    HttpEntityentity = newUrlEncodedFormEntity(params, HTTP.UTF_8); // 设置字符集
    httpPost.setEntity(entity); // 设置参数实体
    HttpResponsehttpResp= httpClient.execute(httpPost); // 获取HttpResponse实例
    if(httpResp.getStatusLine().getStatusCode() == HttpStatus.SC_OK){ //响应通过
    String result = EntityUtils.toString(httpResp.getEntity(), "UTF-8");
    }else{
    //响应未通过
    }
    }catch{}
    然后介绍使用标准java接口进行Http通信,分成两种形式:GET和POST。
    1、其默认使用get请求:
    URL pathUrl= newURL(url); //创建一个URL对象
    HttpURLConnectionurlConnect= (HttpURLConnection) pathUrl.openConnection(); //打开一个HttpURLConnection连接
    urlConnect.setConnectTimeout(3000); // 设置连接超时时间
    urlConnect.connect();
    InputStreamReaderin = newInputStreamReader(urlConnect.getInputStream()); //得到读取的内容
    BufferedReaderbuffer = newBufferedReader(in); //为输出创建BufferedReader
    String inputLine= null;
    while(((inputLine= buffer.readLine()) != null)) {
    //利用循环来读取数据
    }
    2、使用post请求:
    String params= "username=" + URLEncoder.encode("hello", "UTF-8")+ "&password=" + URLEncoder.encode("eoe", "UTF-8");
    byte[] postData= params.getBytes();
    URL pathUrl= newURL(url); //创建一个URL对象
    HttpURLConnectionurlConnect= (HttpURLConnection) pathUrl.openConnection();
    urlConnect.setConnectTimeout(3000); // 设置连接超时时间
    urlConnect.setDoOutput(true); //post请求必须设置允许输出
    urlConnect.setUseCaches(false); //post请求丌能使用缓存
    urlConnect.setRequestMethod("POST"); //设置post方式请求
    urlConnect.setInstanceFollowRedirects(true);
    urlConnect.setRequestProperty("Content-Type","application/x-www-form-urlencode");// 配置请求Content-Type
    urlConnect.connect(); // 开始连接
    DataOutputStreamdos = newDataOutputStream(urlConnect.getOutputStream()); // 发送请求参数
    dos.write(postData);
    dos.flush();
    dos.close();
    if(urlConnect.getResponseCode() == 200) { //请求成功
    byte[] data = readInputStream(urlConnect.getInputStream());
    }
    Socket通常也称做“套接字”,是一种抽象层,应用程序通过它来发送和接收数据,就像应用程序打开了一个文件句柄,将数据读写到稳定的存储器上一样。使用Socket可以将应用程序添加到网络中,并与处于同一网络中的其他应用程序进行通信。一台计算机上的应用程序向socket写入的信息能够被另一台计算机上的另一个应用程序读取,反之依然。
    Socket主要有两种操作方式:面向连接的(流Socket)和无连接的(数据报Socket)。面向连接的Socket操作必须建立一个连接和一个呼叫,所有数据包的到达顺序和发出顺序一致,使用TCP协议,此时Socket必须在发送数据之前与目的地的Socket取得连接,效率不高,但是安全;无连接的Socket操作,数据包到达顺序和发出顺序不保证一致。使用UDP协议,一个数据报是一个独立的单元,它包含了这次投递的所有信息,快速,高效,但安全性不高。若数据的可靠性更重要的话推荐使用面向连接的操作。
    1、服务器端:
    ServerSocketss=newServerSocket(8888); //创建一个ServerSocket对象,并让这个ServerSocket在8888端口监听
    while(true){
    Socket socket=ss.accept(); //调用ServerSocket的accept()方法,接受客户端所发送的请求,如果客户端没有发送数据,那么该线程就停滞丌继续
    try{
    DataInputStreamin=newDataInputStream(socket.getInputStream());//接收客户端信息
    String readline=in.readUTF();
    System.out.println(readline);
    DataOutputStreamout=newDataOutputStream(socket.getOutputStream()); //向客户端发送消息
    out.writeUTF("link server success");
    out.flush();
    in.close(); //关闭流
    out.close();//关闭流
    socket.close();//关闭打开的socket
    } catch{}}
    1、客户端:
    socket = newSocket("192.168.0.37", 8888);
    // 创建Socket,其中ip地址为我的PC机器的地址,手机通过wifi上网和服务器在一个网段
    DataOutputStreamout = newDataOutputStream(socket.getOutputStream()); // 向服务器发送消息
    out.writeUTF(sendMsg);
    out.flush();
    DataInputStreamin = newDataInputStream(socket.getInputStream()); // 接收来自服务器的消息
    String readMsg= in.readUTF();
    if(readMsg!= null) {
    text.setText(readMsg);
    }
    out.close();
    in.close();
    socket.close();
    创建服务端的步骤如下:
    1、指定端口实例化一个ServerSocket;
    2、调用ServerSocket的accept方法以在等待连接期间造成阻塞;
    3、获取位于底层的Socket流以进行读写操作;
    4、将数据封装成流;
    5、对Socket进行读写;
    6、关闭打开的流。
    创建客户端的步骤如下:
    1、通过IP地址和端口实例化Socket,请求连接服务器;
    2、获取Socket上的流以进行读写;
    3、把流包装进输入/输出(比如:BufferedReader/PrintWriter戒者DataOutputStream/ DataInputStream等)的实例;
    4、对Socket进行读写;
    5、关闭打开的流。
  • 相关阅读:
    一次完整的HTTP事务的过程
    移动端事件
    canvas 在视频中的用法
    理解Vue
    改变console.log的输出样式
    百度下拉搜索案例
    Vue总结
    字符串、正则
    .Net Mvc框架知识点
    Lowest Common Ancestor of a Binary Tree -- LeetCode
  • 原文地址:https://www.cnblogs.com/mxzhan/p/13340932.html
Copyright © 2011-2022 走看看