android做客户端连接web服务器

android做客户端连接web服务器

android要想实现应用肯定是离不开连接网络

一、android客户端:
(1)配置文件(AndroidMainfest):
加入下列代码:

<uses-permission android:name="android.permission.INTERNET"/>

添加位置只要在< application>标签外面就可以了

(2)MainActivity:

public class MainActivity extends Activity {
  String result = "";
  String url="http://192.168.0.6:8909/ServletTest/servlet2";
  /*这里是连接服务器的url,如果不懂后面还有更详细地解释*/  
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        /*点击button执行连接网络代码*/        
        findViewById(R.id.button1).setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                connectInternet();
                /*连接网络,result会被赋值*/
                Log.e("asdaa", result);
                /*在控制台输出result*/
            }
        });


    }

    public void connectInternet() {
        new Thread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                HttpClient hc = new DefaultHttpClient();
                HttpPost hp = new HttpPost(
                        url);
                JSONObject jo = new JSONObject();
                /*JSONObject在连接网络传递数据是最常用的包装数据方式,当然也可以直接发送String类型的*/
                try {
                    jo.put("name", "zwq");
                    /*给jo赋值,jo中是以键值对的形式存在*/
                    StringEntity se = new StringEntity(jo.toString());
                    /*包装可以通过网络发送的数据*/
                    hp.setEntity(se);
                    /*将包装好的数据放在hp中*/
                    HttpResponse hr = hc.execute(hp);
                    /*执行连接语句并获得返回数据*/
                    if (hr.getStatusLine().getStatusCode() == 200) 
                    /*200是固定的,如果等于200,就说明服务器连接成功并有返回值*/
                    {
                        result = EntityUtils.toString(hr.getEntity());
                        /*解析获得的数据并赋值给result*/
                    }
                } catch (JSONException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (UnsupportedEncodingException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (ClientProtocolException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }
        }).start();
    }
}

另外说明一下:android4.0以后不能在主线程中连接网络,所以需要重新创建线程;还有除主线程外,其他线程不能改主界面显示的内容,需要用handler配合使用。


二web客户端:
我主要用的是javaee和myeclipse,插件是tomcat,如何配置环境,可以百度搜一下,资料挺多的。

先看一下我的项目目录:
我的项目概况:

(1)配置文件中(web.xml):

<servlet>
  <servlet-name>MMM</servlet-name>
  <!-- 服务名字-->
  <servlet-class>com.test.servlet2</servlet-class>
  <!-- 服务路径,后面有解释-->
  </servlet>
  <servlet-mapping>
  <servlet-name>MMM</servlet-name>
  <!-- 服务名字-->
   <url-pattern>/servlet2</url-pattern>
   <!-- 捕获什么样的url-->
  </servlet-mapping>
</web-app>

前面也提到了url是 “http://192.168.0.6:8909/ServletTest/servlet2”(别点开,点开也没用),192.168.0.6是服务器的IP地址;8909是Tomcat端口号;ServletTest是我自己创建的项目的名字;重点是/servlet2,在配置文件中 < url-pattern>/servlet2< / url-pattern>就是要捕获这个,如果url中符合全部的条件即IP地址没错,端口号没错,项目名称没错,最后面url与< url-pattern>中的对应起来,那客户端就可以访问< servlet-class>com.test.servlet2< /servlet-class>中的这个类了。
(2)servlet2.java中:

public class servlet2 extends HttpServlet {

    /**
     * 
     */
    private static final long serialVersionUID = -8739666074906935331L;

    @Override
    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
        /*从客户端传来的数据放在request,如果传数据方式是doGet,就把request和response传给doPost并执行*/
    }

    @Override
    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        String result = "";
        String b="";

        BufferedReader br = new BufferedReader(new InputStreamReader(
                (ServletInputStream) request.getInputStream(), "utf-8"));

        StringBuffer sb = new StringBuffer("");
        String temp;
        while ((temp = br.readLine()) != null) {
            sb.append(temp);
        }
        br.close();
        /*上述代码都是一样的,我用的时候都是复制的,无外乎就是对数据的截取*/

        System.out.println("请求报文:" + sb.toString());
        System.out.println("请求成功");
        try {
            JSONObject jo=new JSONObject(sb.toString());
             /*把获得String类型数据转化成JSONObject方便操作*/
            if(jo.getString("name").equals("zwq")){
                b="ok";
            }
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("返回报文:" + b.toString());
        PrintWriter pw = response.getWriter();
        pw.write(b.toString());
        /*返回数据*/
        pw.flush();
        pw.close();
    }
}

服务端ok了


需要特别注意的是乱码问题,也百度搜一搜吧。
分享一下我在连接网络的时候经常碰到的问题:
①:配置文件中没有添加网络权限:
< uses-permission android:name=”android.permission.INTERNET”/>
②:服务端出错,现在主要是用tomcat做服务,做好服务端之后可以先用浏览器试用链接
③:不能在主线程连接网络:
android 4.0以后需要添加一个线程去访问网络
④:注意HttpPost中的url,这次因为忽略了”http:”后的”//”弄了半天才纠结过来

因为目前我现在主要研究android,javaweb方面也接触过,看看以后有空的话再详细地解释下javaweb。

这里代码的客户端,使用的是安卓的HttpClient,也可以使用java的HttpURLConnection

  • 3
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值