安卓与PHP服务器交互

android连接数据库的方式有两种,第一种是通过连接服务器,再由服务器读取数据库来实现数据的增删改查,这也是我们常用的方式。第二种方式是android直接连接数据库,这种方式非常耗手机内存,而且容易被反编译造成安全隐患,所以在实际项目中不推荐使用。

本篇博文主要讲述安卓如何与访问远程PHP服务器上的MySQL数据库。

安卓客户端通过HTTP协议与远程服务器进行数据传输,使用Json来作为载体。

注意:

在安卓4.0之后不允许在主线程进行比较耗时的操作,所以要另开一个线程来连接服务器并传输数据。

下面为访问服务器上checkadmin.php的代码,在该线程中将account与loginword以键值对的方式发送给远程服务器,然后接收服务器返回的Json数据格式的isSuccess布尔类型数据,完成登录验证。

private class RequestThread_admin implements Runnable {
        @SuppressWarnings("unchecked")
        public void run()  {
            HttpClient httpClient = new DefaultHttpClient();
            httpClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 5000);//设置链接超时
            httpClient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, 5000); //设置读取超时
            String validateUrl = "http://”服务器地址“/checkadmin.php"; //这里是你与服务器交互的地址
            HttpPost httpRequst = new HttpPost(validateUrl);
            List<BasicNameValuePair> params = new ArrayList<BasicNameValuePair>(); //准备传输的数据
            params.add(new BasicNameValuePair("user", account));
            params.add(new BasicNameValuePair("password", loginword));
            try
            {
                httpRequst.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));//发送请求
                HttpResponse response = httpClient.execute(httpRequst);  //得到响应
                if(response.getStatusLine().getStatusCode() == 200)//返回值如果为200的话则证明成功的得到了数据
                {
                    StringBuilder builder = new StringBuilder();
                    //将得到的数据进行解析
                    BufferedReader buffer = new BufferedReader(
                            new InputStreamReader(response.getEntity().getContent()));
                    for(String s =buffer.readLine(); s!= null; s = buffer.readLine())
                    {
                        builder.append(s);
                    }
                    System.out.println(builder.toString());
                    //得到Json对象
                    JSONObject jsonObject   = new JSONObject(builder.toString());
                    //通过得到键值对的方式得到值

                    isSuccess=jsonObject.getBoolean("isSuccess");
                
                    //在线程中判断是否得到成功从服务器得到数据
                }
                else
                {
                    id=0;
                }
            } catch (Exception e)
            {
                e.printStackTrace();
            }
        }

    }

以下是服务器端checkadmin.php的代码:

<?php  
    //这里应该是是从Mysql数据库中得到相应的数据,  
    //这里仅仅是模拟过程,不再写相应的数据库交互代码  
       $username = str_replace(" ", "", $_POST['user']);  
       $password = str_replace(" ", "", $_POST['password']);  
       $id = 1;  
       $isSuccess=false;
    //将数据存储到数据中 
if($username=="admin")
{
if($password=="123456")
{$isSuccess=true;}

else {$isSuccess=false;}
    $arr = array(  
       
'isSuccess'=>$isSuccess  
        );  
  
    //将数组转成json格式进行传递  
    $strr = json_encode($arr);  
    echo($strr);  
?>  

主线程中登录按钮的监听器如下:

 new Thread(new RequestThread_admin()).start();
                try {

                    Thread.currentThread().sleep(100);//阻断0.1秒

//如果不阻断可能会出现在isSuccess返回前就做判断。当然可以通过设置Thread.Join方法来解决。

                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //show.setText("成功与否:"+isSuccess);
                if(isSuccess)
                {
                    Intent intent=new Intent(MainActivity.this,AdminActivity.class);
                    Bundle bundle=new Bundle();
       
                    bundle.putString("account",account);
                  
                    intent.putExtras(bundle);
                    startActivity(intent);
                }
                if(!isSuccess)
                {
                    Toast.makeText(MainActivity.this, "账号或密码错误,请重新输入" +".....", Toast.LENGTH_LONG).show();
                } //弹出式的提示框
阅读更多
想对作者说点什么?

博主推荐

换一批

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