zoukankan      html  css  js  c++  java
  • Android中的HTTP通信

    自己整理,整理得不好,不喜勿喷!
    HTTP通信
    HttpURLConnection接口
    HTTP超文本传输协议,用于传送WWW方式的数据。HTTP协议采用了请求/响应模式。
    Android提供了HTTPURLConnection和HttpClient接口来开发HTTP程序。
    HTTP使用最多的就是Get和Post,Get请求可以获取静态页面,也可以把参数放在URL字串后面,传递给服务器。HttpUrlConnection是抽象类,
    无法直接实例化对象,所以只能够通过URL的openConnection方法获得。
    URL url = new URL(“http://www.google.com/”);
    HttpURLConnection urlconn = (HttpURlConnection)url.openConneciton();
    openConnection只是创建了实例但并没真正的连接操作。
    //设置输入(输出)流
    urlconn.setDoOutput(true);
    urlconn.setDoInput(true);
    //设置方式POST
    urlconn.setRequestMethod(“POST”);
    //POST请求不能使用缓存
    urlconn.setUseCaches(false);
    //完成连接之后要关闭这个连接
    urlconn.disconnect;
    
    一般代码
    String httpUrl = “http://www.baidu.com”;
    String resultData = null;
    URL url = null;
    try
    {
        url = new URL(http);
    }
    catch(MalformedException)
    {
        
    }
    If(url!=null)
    {
        Try
        { 
            //使用HTTPURLConnetion打开连接
            HttpURLConnetion urlConn = (HttpURLConnetion)url.openConnetion();
            //得到读取的类容
            InputStreamReader in = new InputStreamReader(urlconn.getInputStream());
            BufferReader buffer = new BufferReader(in);
            String inputLine = null;
            While((inputLine = buffer.readLine())!=null)
            {
                resultData += inputLine;
            }
            //关闭InputStreamReader
            In.close();
            //关闭http连接
            Urlconn.disconnect();
        }
    }
    用Get方式传递参数很简单,只需加上传递的参数即可。
    String httpurl1 = “http://www.baidu.com?par=abcdefg”;
    ?par=abcdefg为传递的参数par
    
    由于HttpURLConnection默认使用Get方式,如果我们要像使用Post方式,则只需要setRequestMethod设置
    
    主要代码:
    //设置POST请求方式
    urlconn.setRequestMethod(“POST”);
    
    HttpClient接口
    HttpClient更适合Android上开发互联网应用。
    ClientConnectionManager接口
    ClientConnectionManager是客户端连接管理器接口,主要有以下几个抽象方法。
    closeIdleConnections 关闭空闲的连接
    releaseConnection 释放一个连接
    requestConnection 请求一个新的连接
    shutdown 关闭管理器并释放
    
    DefaultHttpClient
    DefaultHttpClient是默认的一个Http客户端,我们可以使用它创建一个Http连接
    代码:
    HttpClient httpclient = new DefaultHttpClient();
    
    HttpResponse
    HttpRespone是一个Http连接响应,当执行一个HTTP连接后,就会 返回一个HttpResponse,可以通过HttpResponse获得一些响应的信息。
    请求一个Http连接并获得该请求是否成功的代码:
    HttpResponse httpResponse = httpClient.execute(httpRequest());
    If(httpResponse.getStatusLine().getStatusCode()==HttpStatus.SC_OK)
    {
        //连接成功
    }
    HttpClient中如何使用Get方式获取数据。这里需要使用HttpGet来构建一个Get方式的Http请求,
    然后通过HttpClient来执行这个请求,HttpResponse在接收这个请求后给出响应,最后通过“HttpResponse.getStatusLine().getStatusCode()”
    来判断请求是否成功并处理。
    主要代码:
    //http地址
    String httpUrl = “http://192.168.0.1:8080/http1.jsp?par=Http Client_android_Get”;
    //HttpGet连接对象
    HttpGet httpRequest = new HttpGet(httpUrl);
    try
    {
        //获取HttpCilent对象
        HttpClient httpClient = new DefaultHttpClient();
        //请求HttpClient,取得HttpReponse
        HttpResponse httpResponse = httpCilent.execute(httpRequest);
        //判断请求
        If(httpResponse.getStatusLine().getStatusCode()==HttpStatus.SC_OK)
        {
            String strResult = EntityUtil.toString(httpResponse.getEntity());
        }
    }
    catch(ClientProtocolException)
    {
    }
    catch(IOException)
    {
    }
    
    用POST方式与Get方式不一样
    需要使用NameValuePair来保存传递的数据的参数,这里可以使用BasicNameValuePair来构造要被传递的参数,然后通过add方法添加到这个参数到NameValuePair中
    代码:
    //使用NameValuePair来保存要传递的Post参数
    List params = new ArrayList();
    //添加要传递的参数
    Params.add(new BasicNamePair(“par”,”HttpClient_android_Post”));
    Post方式需要设置所使用的字符集,最后就和Get方式一样通过HttpClient来请求这个连接,返回响应并处理。
    
    关键代码:
    //HttpPost连接对象
    HttpPost httpRequest = new HttpPost(httpUrl);
    List params = new ArrayList();
    //添加要传递的参数
    Params.add(new BasicNamePair(“par”,”HttpClient_android_Post”));
    try
    {
        //设置字符集
        HttpEntity httpentity = new UrlEncodedFormEntity(params,”gb2312”);
        //请求httpRequest
        httpRequest.setEntity(httpentity);
        //…………..和Get操作一样
    }
    
    实时更新:
    实时更新需要通过一个线程来控制是视图的更新。
    例:实现android程序中每隔5秒刷新一次视图。
    public class Test_GetOnTimeActivity extends Activity 
    {
        TextView tv ;
        Button btn;
        MyHandler myHandler;
        MyThread myThread;
        
        @Override
        public void onCreate(Bundle savedInstanceState) 
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            tv = (TextView)findViewById(R.id.textView1);
            btn = (Button)findViewById(R.id.button1);
            btn.setOnClickListener(new Button.OnClickListener()
            {
                
                @Override
                public void onClick(View v) 
                {
                    refresh();
                }
                
            }
            );
            myHandler = new MyHandler();
            myThread = new MyThread();
            new Thread(myThread).start();
        }
        
        //刷新网页更新
        private void refresh()
        {
            String httpUrl = "http://www.sina.com.cn/";
            String resultData = null;
            URL url = null;
            try
            {
                url = new URL(httpUrl);
            }
            catch(MalformedURLException e)
            {
                e.printStackTrace();
            }
            if(url!=null)
            {
                try
                {
                    HttpURLConnection urlConn = (HttpURLConnection)url.openConnection();
                    InputStreamReader in = new InputStreamReader(urlConn.getInputStream());
                    BufferedReader buffer = new BufferedReader(in);
                    String inputLine = null;
                    while((inputLine = buffer.readLine())!=null)
                    {
                        resultData += inputLine+"\n";
                    }
                    in.close();
                    urlConn.disconnect();
                }
                catch(IOException e)
                {
                    e.printStackTrace();
                }
                if(resultData!=null)
                {
                    tv.setText(resultData);
                }
                else
                {
                    tv.setText("No data");
                }
            }
        }
        
        class MyThread implements Runnable
        {
            
            @Override
            public void run() 
            {
                while(true)
                {
                    try
                    {
                        Thread.sleep(5*1000);
                        myHandler.sendMessage(myHandler.obtainMessage());
                    }
                    catch(InterruptedException e)
                    {
                        e.printStackTrace();
                    }
                }
            }
        }
        
        class MyHandler extends Handler
        {
            
            @Override
            public void handleMessage(Message msg) 
            {
                super.handleMessage(msg);
                refresh();
            }
            
            public MyHandler() 
            {
                super();
            }
            
        }
    }

    http://blog.sina.com.cn/s/blog_6e13876401013hpm.html  转

  • 相关阅读:
    LINQTOSQL作为底层ORM框架后,我们的数据基类就变成了这个样子
    一個傳統的C2C網站的用戶充值的过程
    ajax跨域获取数据
    C#+HTML+JS生成的树完整代码
    核心Swing组件(六)
    Swing组件集合的事件处理(六)
    Swing组件集合的事件处理(四)
    核心Swing组件(四)
    核心Swing组件(三)
    核心Swing组件(五)
  • 原文地址:https://www.cnblogs.com/622698abc/p/2767110.html
Copyright © 2011-2022 走看看