android手机访问本地电脑Web服务器

1.android网络编程知识复习

Android的网络编程分为2种:基于http协议的,和基于socket的。Socket一般应用于社交聊天的应用中,这里关联的比较少就不讲了,我们来说说基于HTTP协议的编程。

  • 基本原理 : 它的工作原理特别的简单,就是客户端向服务器发出一条HTTP 请求,服务器收到请求之后会返回一些数据给客户端,然后客户端再对这些数据进行解析和处理就可以了。

  • HTTP请求:HttpURLConnection 和 HttpClient

  • 服务器端返回客户端的内容:
    1)以HTML代码的形式返回。
    2)以XML字符串的形式返回。返回的数据需要通过XML解析(SAX、DOM,Pull,等)器进行解析。
    3)以json对象的方式返回。

2. HTTP请求网络数据

HttpClient在API等级22:Android 5.1 Lollipop开始被google废弃

HttpURLConnection 请求网络:

private void getXMLWithHttpURLConnection(){
    new Thread(new Runnable() {
        @Override
        public void run() {
            HttpURLConnection urlConnection = null;
            try {
                Log.e(TAG,"开始请求网络数据...");
                URL url = new URL("http://192.168.31.139/people.xml");
                //利用HttpURLConnection对象从网络中请求网络数据
                urlConnection = (HttpURLConnection) url.openConnection();
                urlConnection.setRequestMethod("GET"); //设置请求方式GET,POST
                //设置连接超时,如果网络不好,Android系统在超过默认时间会收回资源中断操作
                urlConnection.setConnectTimeout(8000); 
                //connection.setReadTimeout(5000);    //设置读取超时
                if (urlConnection.getResponseCode() != 200) { 
                    //对响应码进行判断,200为成功
                    throw new RuntimeException("请求url失败");
                }
                //从Internet获取网页,发送请求,将网页以流的形式读回来
                InputStream inputStream = urlConnection.getInputStream();
                ////对输入流进行读取
                BufferedReader bufferedReader = 
                                new BufferedReader(new InputStreamReader(inputStream));
                String line;
                StringBuilder stringBuilder = new StringBuilder();
                while ((line = bufferedReader.readLine())!=null){ 
                    stringBuilder.append(line);
                }
                //解析xml,下一节就讲
                parseXMLWithPull(stringBuilder.toString());

            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                Log.e(TAG,"关闭请求连接。");
                if (urlConnection!=null) urlConnection.disconnect();
            }
        }
    }).start();
}    

3.解析XML数据

3.1 PULL解析:

在Android上使用XmlPullParser是一中高效率和易维护解析XML的方法 。Android已经在历史上有两个实现这个接口实现类:

(1)KXmlParser,通过XmlPullParserFactory.newPullParser();
(2)ExpatPullParser,通过Xml.newPullParser();
    /**
     *      PULL 解析 xml
     * @param xmlString
     */
    private void parseXMLWithPull(String xmlString){
        try {
            Log.d(TAG,">>> 开始解析XML...");
            //获取XmlPullParser对象
            //第一种获取XmlPullParser对象的方式
            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
            XmlPullParser parser = factory.newPullParser();
            //第二种获取XmlPullParser对象的方式
            //XmlPullParser parser=Xml.newPullParser(); 

            parser.setInput(new StringReader(xmlString));
            int eventType = parser.getEventType();
            String name ="姓名";
            String age ="年龄";
            String sex ="性别";
            while (eventType !=XmlPullParser.END_DOCUMENT ){
                String nodeName = parser.getName();
                switch (eventType){
                    //开始读取XML文档 ,对应people节点
                    case XmlPullParser.START_DOCUMENT:
                        break;
                    // 开始解析某个结点,对应name ,age,sex标签
                    case XmlPullParser.START_TAG:
                        if ("name".equals(nodeName)) name = parser.nextText();
                        if ("age".equals(nodeName)) age = parser.nextText();
                        if ("sex".equals(nodeName)) sex = parser.nextText();
                        break;
                    // 完成解析某个结点,对应person节点
                    case XmlPullParser.END_TAG:
                        if ("person".equals(nodeName)){
                            Log.d(TAG,"--name is:" + name);
                            Log.d(TAG,"--age is:" + age);
                            Log.d(TAG,"--sex is:" + sex);
                        }
                        break;
                    default:
                        break;
                }
                eventType = parser.next();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

3.2 建立本地web服务器:

讲了这么多, 到这里才跟标题挂上钩,我也是醉了。
第2节HTTP请求网络数据中的链接 http://192.168.31.139/people.xml 就是在本地建立的一个服务器里的文件,192.168.31.139就是本人的ip地址,people.xml就是我新建的xml 文件。步骤如下:

1.在http://rj.baidu.com/soft/detail/14824.html?ald 下载 Apache HTTP Server软件,下载完成后双击下载文件httpd-2.2.25-win32-x86-no_ssl.msi安装,
这里写图片描述

2.在安装路径…\Apache2.2\htdocs新建people.xml文件
3.在浏览器中输入http://127.0.0.1/people.xml,即可访问到我们刚刚建立的people.xml文件内容
这里写图片描述

4.值得注意的问题

在手机上访问本地电脑web服务器,设置”localhost”或者”127.0.0.1”是不行的,在模拟器上将 ip设置为”10.0.2.2”是可以访问的,但到真机上此方法行不通。

真机连接方法:1.本地电脑搭建的服务器与手机共同连接到一个无线网络下。
        2.服务器端需要关闭防火墙。
这里写图片描述
  

其实在有无线局域网的情况下真机与模拟器连接本地服务端是一样的,唯一区别是真机连接到本地服务器需要关闭防火墙。
阅读更多
版权声明:本文为博主【limin13215】原创文章,欢迎转载,转载请注明链接地址! https://blog.csdn.net/limin13215/article/details/51509332
个人分类: Android应用开发
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭