开发自己的监控系统一、email篇
开发自己的监控系统二、web篇

移动篇(android)
关键字:java、android、json、php

互联网已经进入大数据时代,如果没有给自己的产品开发手机端的应用程序,出门都不好意思跟别人打招呼了~~
为了随时随地掌握服务器的运行状态,当然,也为了装ability,下面就来为我们的监控系统开发一个手机端(android)的应用。

原理:
首先编写一个web接口,读取数据库服务器数据,返回json对象数组。android应用程序解析json数据,通过listvie控件显示。

以下是web接口,php编写,pdo方式连接数据库,使用json_encode将字符串转换为json对象格式,代码如下:

<?php    $dbms='mysql';     //数据库类型 oracle 用ODI,对于开发者来说,使用不同的数据库,只要改这个,不用记住那么多的函数了    $host='localhost'; //数据库主机名    $dbName='monitor';    //使用的数据库    $user='user1';      //数据库连接用户名    $pass='Root123';         //对应的密码    $dsn="$dbms:host=$host;dbname=$dbName";     try {        $dbh=new PDO($dsn,$user,$pass);//初始化一个PDO对象,就是创建了数据库连接对象$dbh        $jsonString=json_encode($dbh->query('select * from servers')->fetchAll(PDO::FETCH_ASSOC));        print_r($jsonString);    } catch (PDOException $e) {        die("Error!:".$e->getMessage());    }?>

注:接口可以使用任何语言编写,只要能返回json对象数组就行。

使用浏览器访问该接口,返回json对象数组:
开发自己的监控系统三、移动篇(android)_第1张图片

接下来就是应用的开发了。
大体思路:使用HttpClient接口向web接口提交get请求,取回json数据,然后解析json数据并显示在listview构造的表格中。
eclipse项目结构如下:
开发自己的监控系统三、移动篇(android)_第2张图片

AndroidManifest.xml:

<?xml version= "1.0" encoding ="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.cszhi.mymonitor"    android:versionCode= "1"    android:versionName= "1.0" >     <uses-sdk        android:minSdkVersion="8"        android:targetSdkVersion="17" />        <uses-permission android:name="android.permission.INTERNET" /><!-- 网路连接权限-->    <uses-permission android:name= "android.permission.ACCESS_NETWORK_STATE" /><!-- 允许访问网络状态-->    <application        android:allowBackup="true"        android:icon="@drawable/ic_launcher"        android:label="@string/app_name"        android:theme="@style/AppTheme" >        <activity            android:screenOrientation="landscape"            android:name="com.cszhi.mymonitor.MainActivity"            android:label="@string/app_name" >            <intent-filter>                <action android:name="android.intent.action.MAIN" />                 <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>    </application > </manifest>
server_list.xml:

<?xml version= "1.0" encoding ="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width= "wrap_content"    android:layout_height= "20dp"    android:orientation= "horizontal" >     <TableLayout android:id="@+id/table"            android:layout_width="wrap_content"             android:layout_height="wrap_content" >        <TableRow >            <View android:layout_width="1dip" android:background= "#FF909090" />                  <TextView                      android:id="@+id/id"                      android:layout_width="20dp"                        android:gravity="center"                         android:layout_height="wrap_content" />                      <View android:layout_width="1dip" android:background= "#FF909090" />                  <TextView                      android:id="@+id/hostname"                      android:layout_width="70dp"                        android:gravity="center"                        android:layout_height="wrap_content" />                   <View android:layout_width="1dip" android:background= "#FF909090" />                  <TextView                      android:id="@+id/ip"                      android:layout_width="100dp"                        android:gravity="center"                        android:layout_height="wrap_content" />                   <View android:layout_width="1dip" android:background= "#FF909090" />                  <TextView                      android:id="@+id/rootpartion"                      android:layout_width="100dp"                        android:gravity="center"                        android:layout_height="wrap_content" />                   <View android:layout_width="1dip" android:background= "#FF909090" />                  <TextView                      android:id="@+id/uptime"                      android:layout_width="100dp"                        android:gravity="center"                        android:layout_height="wrap_content" />                   <View android:layout_width="1dip" android:background= "#FF909090" />                  <TextView                      android:id="@+id/time"                      android:layout_width="85dp"                        android:gravity="center"                        android:layout_height="wrap_content" />                   <View android:layout_width="1dip" android:background= "#FF909090" />                </TableRow>          </TableLayout></LinearLayout>
activity_main.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools= "http://schemas.android.com/tools"    android:layout_width= "match_parent"    android:layout_height= "match_parent"    android:orientation= "vertical"    android:paddingBottom= "@dimen/activity_vertical_margin"    android:paddingLeft= "@dimen/activity_horizontal_margin"    android:paddingRight= "@dimen/activity_horizontal_margin"    android:paddingTop= "@dimen/activity_vertical_margin"    tools:context= ".MainActivity" >     <Button           android:id="@+id/bn"           android:layout_width="wrap_content"           android:layout_height="wrap_content"           android:layout_marginLeft="20dp"           android:text="刷新" />     <ListView           android:id="@+id/lvTitle"           android:background="#bfe1f2"           android:layout_width="wrap_content"           android:layout_height="wrap_content" />     <ListView           android:id="@+id/lv"           android:layout_width="wrap_content"           android:layout_height="wrap_content" /> </LinearLayout>
MyHttp.java:
用于提交get请求,获取接口返回的数据。

package com.cszhi.mymonitor; import java.io.IOException; import org.apache.http.HttpResponse;import org.apache.http.HttpStatus;import org.apache.http.client.ClientProtocolException;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.util.EntityUtils; public class MyHttp {        public String httpGet(String url){              String response= null;              HttpClient httpClient= new DefaultHttpClient();              HttpGet httpGet= new HttpGet(url);              HttpResponse httpResponse;               try{                     httpResponse=httpClient.execute(httpGet);                      int statusCode=httpResponse.getStatusLine().getStatusCode();                      if(statusCode==HttpStatus.SC_OK){                            response=EntityUtils. toString(httpResponse.getEntity());                     }              } catch(ClientProtocolException e){                     e.printStackTrace();              } catch(IOException e){                     e.printStackTrace();              }                             return response;       }}
MainActivity.java

package com.cszhi.mymonitor; import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map; import org.json.JSONArray;import org.json.JSONObject; import android.net.ConnectivityManager;import android.net.NetworkInfo;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.app.Activity;import android.content.Context;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.view.Window;import android.widget.Button;import android.widget.ListView;import android.widget.SimpleAdapter;import android.widget.Toast; public class MainActivity extends Activity {         //jsonstring 字符串,用于存放通过url获取的json数据       String jsonstring=null ;        //接口地址       String url= "http://60.191.231.17/get.php" ;        @Override        protected void onCreate(Bundle savedInstanceState) {               super.onCreate(savedInstanceState);               //用于等待图标              requestWindowFeature(Window. FEATURE_INDETERMINATE_PROGRESS);              setContentView(R.layout. activity_main);               Button bn=(Button) findViewById(R.id. bn);                //处理线程传递来的消息               final Handler myhandler =new Handler(){                      public void handleMessage(Message msg){                             ListView lv=(ListView) findViewById(R.id. lv);                           String[] from={"id","hostname" ,"ip" ,"rootpartion" ,"uptime" ,"time" };                            int[] to={R.id.id,R.id.hostname ,R.id.ip,R.id.rootpartion,R.id. uptime,R.id.time };                            List<Map<String,?>> listb= new ArrayList<Map<String,?>>();                           Map<String,String> b= new HashMap<String, String>();                           b.put( "id", "id" );                           b.put( "hostname", "hostname" );                           b.put( "ip", "ip" );                           b.put( "rootpartion","rootpartion" );                           b.put( "uptime","uptime" );                           b.put( "time", "time" );                           listb.add(b);                            ListView lvtitle=(ListView) findViewById(R.id.lvTitle );                           SimpleAdapter adapterb= new SimpleAdapter(MainActivity.this ,listb,R.layout.server_list,from,to);                           lvtitle.setAdapter(adapterb);                            List<Map<String,?>> list= new ArrayList<Map<String,?>>();                            try{                                  JSONArray jsonArray= new JSONArray(jsonstring );                                    //解析json对象,并放入hashmap中                                   for(int i=0;i<jsonArray.length();i++){                                         JSONObject item=jsonArray.getJSONObject(i);                                         Map<String,String> m=new HashMap<String, String>();                                          m.put( "id", item.getString("id" ));                                         m.put( "hostname", item.getString("hostname" ));                                         m.put( "ip", item.getString("ip" ));                                         m.put( "rootpartion",item.getString("rootpartion" ));                                         m.put( "uptime", item.getString("uptime" ));                                         m.put( "time", item.getString("time" ));                                         list.add(m);                                  }                           } catch(Exception e){                                  e.printStackTrace();                           }                             //这里的this是Handler,因为这个方法是在放在Handler里的,所以这里不应该使用this,而应该使用MainActivity.this(MainActivity是类名)                           SimpleAdapter adapter= new SimpleAdapter(MainActivity.this ,list,R.layout.server_list,from,to);                            lv.setAdapter(adapter);                             //关闭等待图标(右上角的转圈)                           setProgressBarIndeterminateVisibility( false);                     }              };                //Runnable接口               final Runnable st=new Runnable() {                      @Override                      public void run() {                           data( url);                           myhandler.sendEmptyMessage(0);                     }              };                //检查是否有网络连接               if(!checkNet( this)){                     Toast. makeText(this, "网络连接失败,请检查网络" ,Toast.LENGTH_LONG).show();              } else{                      new Thread(st).start();                     setProgressBarIndeterminateVisibility( true);              }                //单击按钮                  bn.setOnClickListener( new OnClickListener() {                      @Override                      public void onClick(View arg0) {                            // TODO Auto-generated method stub                            //如果有网路连接,创建新线程,传入 st接口,并启动该线程                            if(!checkNet(MainActivity. this)){                                  Toast. makeText(MainActivity.this, "网络连接失败,请检查网络" ,Toast.LENGTH_LONG).show();                                   return;                           } else{                                   new Thread(st).start();                                   //显示等待图标(右上角的转圈)                                  setProgressBarIndeterminateVisibility( true);                           }                     }              });                  }         //获取url数据,并赋值给jsonstring        private void data(String url){              MyHttp myHttp= new MyHttp();              jsonstring= myHttp.httpGet(url);       }         //检查是否有网络的函数        public static boolean checkNet(Context context) {               try {                     NetworkInfo networkInfo = (( ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE )).getActiveNetworkInfo();                      if (networkInfo != null) {                           Log. d("httpjson", "true");                            return true ;                     } else {                           Log. d("httpjson", "false");                            return false ;                     }              } catch (Exception e) {                     e.printStackTrace();                      return false ;              }       } }

编译,传到手机上安装运行:
开发自己的监控系统三、移动篇(android)_第3张图片

可以根据自己需求添加其它功能,如定时刷新,声音报警等。
如下截图是我为部门运维服务器开发的手机端监控程序,支持按管理员监控服务器,支持按不同监控项目排序:
开发自己的监控系统三、移动篇(android)_第4张图片

参考:
尚学堂科技.马士兵.JAVA视频教程
疯狂android讲义
http://developer.android.com/training/index.html

更多相关文章

  1. Android[中级教程]第八章 Json数据的处理
  2. (转)Android从服务器端获取数据的几种方法
  3. 【Android Training - 04】保存数据 [ Lesson 2 - 保存文件]
  4. Android adb forward转发TCP端口连接数据
  5. Android:SNS客户端开发四:数据库操作(二)
  6. Android之MVP模式实现登录和网络数据加载
  7. Android Activity之间传递类对象
  8. android 一个SQLite数据库多个数据表的基本使用框架 (带demo)

随机推荐

  1. Cocos2dx发布Android包,配置开发环境(菜鸟
  2. 转- ADB(Android Debug Bridge)技术实现
  3. Android(安卓)ndk入门准备--hello jni
  4. TAG解决错误:Error:No resource identifie
  5. ubuntu android studio ndk 配置
  6. android-获取手机电话的状态
  7. Android导入源码
  8. 调用Android系统设置中的Intent
  9. Android中WebView使用规范
  10. Android中使用开源框架Citypickerview实