基本原理是Android客户端通过HttpClient向服务器发出请求,服务器向Android客户端返回JSON字符串,Android客户端解析JSON字符串获得数据。

1. 新建一个Android项目,主要文件如下:

其中MainActivity是UI,CommThread是通信线程,负责和服务器通信,Util是工具类,Var存放变量。

2. Var.java:

  1. package com.hzhi.school.util;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.List;
  5.  
  6. public class Var {
  7.  
  8. // 访问的URL
  9. public static String strHost = new String("http://192.168.1.100:8080/School/");
  10. public static String strAct = new String("aclasquery");
  11. public static String strURL = strHost + strAct;
  12.  
  13. // 列表
  14. public static List lstId = new ArrayList();
  15. public static List lstName = new ArrayList();
  16. public static List lstComm = new ArrayList();
  17.  
  18. // 屏幕的尺寸
  19. public static int wid_scr;
  20. public static int hei_scr;
  21.  
  22. // 消息类型
  23. public static final int msg_connect = 1;
  24. public static final int msg_error = 2;
  25. public static final int msg_con_start = 3;
  26. public static final int msg_con_stop = 4;
  27.  
  28. }

3. Util.java:

  1. package com.hzhi.school.util;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.InputStream;
  5. import java.io.InputStreamReader;
  6.  
  7. import org.json.JSONArray;
  8. import org.json.JSONException;
  9. import org.json.JSONObject;
  10.  
  11. import android.util.Log;
  12.  
  13. public class Util {
  14.  
  15. // 构造类
  16. public Util(){
  17.  
  18. }
  19.  
  20. // 将InputStream格式转化为StringBuilder格式
  21. public static StringBuilder is2sb (InputStream is) {
  22.  
  23. String ln = "";
  24. StringBuilder sb = new StringBuilder();
  25. BufferedReader br = new BufferedReader(new InputStreamReader(is));
  26. try{
  27. while ((ln=br.readLine()) != null){
  28. sb.append(ln);
  29. }
  30.  
  31. }catch(Exception e){
  32. e.printStackTrace();
  33. }
  34. return sb;
  35.  
  36. }
  37.  
  38. // JSON转换成List
  39. public static void json2list(String strJson) throws JSONException {
  40.  
  41. JSONObject jsonObject = new JSONObject(strJson);
  42. JSONArray jsonClas = jsonObject.getJSONArray("Classes");
  43. for (int i=0; i<jsonClas.length(); i++){
  44. Var.lstId.add(i, jsonClas.getJSONObject(i).getString("id"));
  45. Var.lstName.add(i, jsonClas.getJSONObject(i).getString("name"));
  46. Var.lstComm.add(i, jsonClas.getJSONObject(i).getString("comment"));
  47. }
  48.  
  49. }
  50.  
  51. }

4. CommThread.java:

  1. package com.hzhi.school.comm;
  2.  
  3. import java.io.InputStream;
  4. import java.util.ArrayList;
  5. import java.util.List;
  6.  
  7. import org.apache.http.HttpResponse;
  8. import org.apache.http.client.HttpClient;
  9. import org.apache.http.client.methods.HttpGet;
  10. import org.apache.http.impl.client.DefaultHttpClient;
  11.  
  12. import android.os.Bundle;
  13. import android.os.Message;
  14. import android.util.Log;
  15.  
  16. import com.hzhi.school.MainActivity;
  17. import com.hzhi.school.util.Util;
  18. import com.hzhi.school.util.Var;
  19.  
  20. public class CommThread extends Thread{
  21.  
  22. // 消息变量
  23. private Message msg;
  24. private Bundle bdl;
  25.  
  26. // 构造函数
  27. public void run(){
  28.  
  29. InputStream resIS;
  30. StringBuilder resSB;
  31. String resStr;
  32.  
  33. resIS = getIS(Var.strURL);
  34. if (resIS == null)
  35. {
  36. return;
  37. }
  38. else
  39. {
  40. resSB = Util.is2sb(resIS);
  41. resStr = resSB.toString();
  42. try{
  43. Util.json2list(resStr);
  44. sendMessage(Var.msg_connect,"");
  45. }catch (Exception e){
  46. e.printStackTrace();
  47. sendMessage(Var.msg_error,e.toString());
  48. }
  49. }
  50.  
  51. }
  52.  
  53. // 通过GET方法获取信息
  54. public InputStream getIS (String url){
  55.  
  56. InputStream is=null;
  57.  
  58. try{
  59. // 取得默认HttpClient实例
  60. HttpClient hc = new DefaultHttpClient();
  61. // 连接到服务器
  62. HttpResponse hr = hc.execute(new HttpGet(url));
  63. // 获取数据内容
  64. is = hr.getEntity().getContent();
  65. }catch (Exception e){
  66. e.printStackTrace();
  67. sendMessage(Var.msg_error,e.toString());
  68. }
  69.  
  70. return is;
  71.  
  72. }
  73.  
  74. // 发送消息(用于更新UI)
  75. public void sendMessage(int x, String s){
  76.  
  77. msg = new Message();
  78. bdl = new Bundle();
  79. bdl.putString("1",s);
  80. msg.what = x;
  81. msg.setData(bdl);
  82. MainActivity.mainHandler.sendMessage(msg);
  83.  
  84. }
  85.  
  86. }

使用HttpClient向服务器发出请求,服务器返回的是一个InputStream,调用Util里面的函数将InputStream转换成StringBuilder,获得JSON字符串,再解析JSON字符串,获得数据。

5. MainActivity.java:

  1. package com.hzhi.school;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.List;
  5.  
  6. import android.app.ListActivity;
  7. import android.app.ProgressDialog;
  8. import android.content.Context;
  9. import android.graphics.Typeface;
  10. import android.os.Bundle;
  11. import android.os.Handler;
  12. import android.os.Message;
  13. import android.util.Log;
  14. import android.view.Gravity;
  15. import android.view.View;
  16. import android.view.View.OnClickListener;
  17. import android.view.ViewGroup;
  18. import android.widget.BaseAdapter;
  19. import android.widget.Button;
  20. import android.widget.LinearLayout;
  21. import android.widget.ListView;
  22. import android.widget.TextView;
  23. import android.widget.Toast;
  24.  
  25. import com.hzhi.school.comm.CommThread;
  26. import com.hzhi.school.util.Var;
  27.  
  28. public class MainActivity extends ListActivity{
  29.  
  30. static list_clas_adaptor myAdaptor;
  31. static Context mCtx;
  32. static ProgressDialog progressDialog;
  33. static Toast toast;
  34. CommThread myThread;
  35. static int numGet = 0;
  36. ListView lv;
  37. int id;
  38. item_clas it;
  39.  
  40. @Override
  41. protected void onCreate(Bundle savedInstanceState) {
  42.  
  43. super.onCreate(savedInstanceState);
  44. setContentView(R.layout.activity_list_clas);
  45. mCtx = getApplicationContext();
  46. getScreen();
  47. myAdaptor = new list_clas_adaptor(this);
  48. progressDialog = ProgressDialog.show(MainActivity.this,
  49. "连接", "正在连接服务器:" + Var.strURL, true, false);
  50. setListAdapter(myAdaptor);
  51.  
  52. myThread = new CommThread();
  53. myThread.start();
  54. }
  55.  
  56. protected void onListItemClick(ListView l, View v, int position, long id) {
  57. id = Integer.parseInt((String) myAdaptor.list_data.get(position).txtNum.getText());
  58. it = (item_clas) myAdaptor.getItem((int)id);
  59. super.onListItemClick(l, v, position, id);
  60. }
  61.  
  62. // 获得课程列表
  63. public static void getData(){
  64. myAdaptor.list_data.clear();
  65. if (Var.lstId.size()>0){
  66. for (int i=0; i<Var.lstId.size(); i++){
  67. myAdaptor.addItem(Var.lstId.get(i).toString(),
  68. Var.lstName.get(i).toString(), Var.lstComm.get(i).toString(), 1);
  69.  
  70. }
  71. }
  72. numGet++;
  73. }
  74.  
  75. // 消息处理Handler
  76. public static Handler mainHandler = new Handler() {
  77. public void handleMessage(Message msg) {
  78. switch (msg.what)
  79. {
  80.  
  81. // 出错
  82. case Var.msg_error:
  83. toast = Toast.makeText(mCtx,
  84. "错误:" + msg.getData().getString("1"), Toast.LENGTH_LONG);
  85. toast.show();
  86. break;
  87. // 已连接成功
  88. case Var.msg_connect:
  89. progressDialog.dismiss();
  90. getData();
  91. myAdaptor.notifyDataSetChanged();
  92. toast = Toast.makeText(mCtx,
  93. "连接服务器并返回数据成功!", Toast.LENGTH_LONG);
  94. toast.show();
  95. break;
  96.  
  97. }
  98. super.handleMessage(msg);
  99. }
  100. };
  101.  
  102. // 获得屏幕尺寸
  103. public void getScreen(){
  104. Var.wid_scr = getWindowManager().getDefaultDisplay().getWidth();
  105. Var.hei_scr = getWindowManager().getDefaultDisplay().getHeight();
  106. }
  107.  
  108. }
  109.  
  110. //课程列表
  111. class list_clas_adaptor extends BaseAdapter implements OnClickListener{
  112.  
  113. public Context ctx;
  114. public List<item_clas> list_data;
  115. public String s1, s2;
  116.  
  117. public list_clas_adaptor(Context context){
  118. ctx =context;
  119. list_data = new ArrayList<item_clas>();
  120. }
  121.  
  122. @Override
  123. public int getCount() {
  124. // TODO Auto-generated method stub
  125. return list_data.size();
  126. }
  127.  
  128. @Override
  129. public Object getItem(int id) {
  130. // TODO Auto-generated method stub
  131. s2 = String.valueOf(id);
  132. for (int i=0; i<list_data.size(); i++){
  133. s1 = (String) list_data.get(i).txtNum.getText();
  134. if (s1.equals(s2))
  135. return list_data.get(i);
  136. }
  137.  
  138. return null;
  139.  
  140. }
  141.  
  142. @Override
  143. public long getItemId(int position) {
  144. // TODO Auto-generated method stub
  145. return list_data.indexOf(position);
  146. }
  147.  
  148. @Override
  149. public View getView(int position, View convertView, ViewGroup parent) {
  150. // TODO Auto-generated method stub
  151.  
  152. item_clas my_item;
  153. if (convertView == null)
  154. {
  155. my_item = new item_clas(ctx,
  156. (String)list_data.get(position).txtNum.getText(),
  157. (String)list_data.get(position).txtName.getText(),
  158. (String)list_data.get(position).txtComm.getText()
  159. ,1);
  160. }
  161. else
  162. {
  163. my_item = (item_clas)convertView;
  164. my_item.txtNum.setText(list_data.get(position).txtNum.getText());
  165. my_item.txtName.setText(list_data.get(position).txtName.getText());
  166. my_item.txtComm.setText(list_data.get(position).txtComm.getText());
  167. }
  168.  
  169. // 点击删除按钮
  170. my_item.btnDel.setOnClickListener(new OnClickListener() {
  171. @Override
  172. public void onClick(View v) {
  173.  
  174. } });
  175.  
  176. // 点击修改按钮
  177. my_item.btnMdf.setOnClickListener(new OnClickListener() {
  178. @Override
  179. public void onClick(View v) {
  180.  
  181. }
    });
  182.  
  183. return my_item;
  184. }
  185.  
  186. public void addItem(String num, String name, String comm, int x)
  187. {
  188. list_data.add(new item_clas(ctx, num, name, comm, x));
  189. }
  190.  
  191. @Override
  192. public void onClick(View v) {
  193.  
  194. }
  195.  
  196. }
  197.  
  198. // clas列表的一行
  199. class item_clas extends LinearLayout{
  200.  
  201. public TextView txtNum;
  202. public TextView txtName;
  203. public TextView txtComm;
  204. public TextView txtMdf;
  205. public TextView txtDel;
  206. public Button btnMdf;
  207. public Button btnDel;
  208.  
  209. public item_clas(Context ctx, String num, String name, String comm, int x)
  210. {
  211. super(ctx);
  212. this.setOrientation(HORIZONTAL);
  213. int hei = 60;
  214.  
  215. txtNum = new TextView(ctx);
  216. txtNum.setText(num);
  217. txtNum.setGravity(Gravity.CENTER);
  218. txtNum.setTypeface(Typeface.DEFAULT_BOLD, Typeface.BOLD);
  219. addView(txtNum, new LinearLayout.LayoutParams((int)(Var.wid_scr*0.1),hei));
  220.  
  221. txtName = new TextView(ctx);
  222. txtName.setText(name);
  223. txtName.setGravity(Gravity.CENTER);
  224. txtName.setTypeface(Typeface.DEFAULT_BOLD, Typeface.BOLD);
  225. addView(txtName, new LinearLayout.LayoutParams((int)(Var.wid_scr*0.2),hei));
  226.  
  227. txtComm = new TextView(ctx);
  228. txtComm.setText(comm);
  229. Gravity g = new Gravity();
  230. txtComm.setGravity(Gravity.LEFT);
  231. addView(txtComm, new LinearLayout.LayoutParams((int)(Var.wid_scr*0.4),hei));
  232.  
  233. if (x==0){
  234. txtDel = new TextView(ctx);
  235. txtDel.setText("删除");
  236. txtDel.setGravity(Gravity.CENTER);
  237. addView(txtDel, new LinearLayout.LayoutParams((int)(Var.wid_scr*0.15),hei));
  238. Log.i("addView", txtDel.getText().toString());
  239.  
  240. txtMdf = new TextView(ctx);
  241. txtMdf.setText("更新 ");
  242. txtMdf.setGravity(Gravity.CENTER);
  243. addView(txtMdf, new LinearLayout.LayoutParams((int)(Var.wid_scr*0.15),hei));
  244. Log.i("comm=", comm);
  245. Log.i("addView", txtMdf.getText().toString());
  246. }
  247.  
  248. else{
  249. btnDel = new Button(ctx);
  250. btnDel.setText("删除");
  251. btnDel.setGravity(Gravity.CENTER);
  252. btnDel.setTypeface(Typeface.DEFAULT_BOLD, Typeface.BOLD);
  253. btnDel.setFocusable(false);
  254. addView(btnDel, new LinearLayout.LayoutParams((int)(Var.wid_scr*0.15),hei));
  255.  
  256. btnMdf = new Button(ctx);
  257. btnMdf.setText("更新");
  258. btnMdf.setGravity(Gravity.CENTER);
  259. btnMdf.setTypeface(Typeface.DEFAULT_BOLD, Typeface.BOLD);
  260. btnMdf.setFocusable(false);
  261. addView(btnMdf, new LinearLayout.LayoutParams((int)(Var.wid_scr*0.15),hei));
  262. }
  263. }
  264.  
  265. }

MainActivity调用CommThread访问服务器,获得数据后通过BaseAdaptor显示出来。在item_clas类中,由于点击每一行会被系统误以为是在点击Button,所以要给Button加上:

  1. setFocusable(false);

运行结果:

SSH服务器与Android通信(2)--Android客户端接收数据的更多相关文章

  1. 使用Socket通信实现Silverlight客户端实时数据的获取(模拟GPS数据,地图实时位置)

    原文:使用Socket通信实现Silverlight客户端实时数据的获取(模拟GPS数据,地图实时位置) 在上一篇中说到了Silverlight下的Socket通信,在最后的时候说到本篇将会结合地图. ...

  2. SSH服务器与Android通信(3)--Android客户端发送数据

    Android客户端向SSH服务器发送数据主要有三种情况:通过客户端删除数据.添加数据和修改数据. 1.删除数据 先看看jsp文件里面是怎样删除数据的: <td align="cent ...

  3. Android笔记:Socket客户端收发数据

    client.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" and ...

  4. Java Socket 服务端发送数据 客户端接收数据

    服务端: package com.thinkgem.wlw.modules.api.test.socket; /** * @Author: zhouhe * @Date: 2019/4/8 9:30 ...

  5. android socket 通讯(客户端) 发送数据

    /** ClientSocket通讯类 **/  public class ClientSocket  {     /**服务器地址*/     private String serverUrl=&q ...

  6. android中如何发送及接收数据(两种方法)?

    1.如在MainActivity.java中的按钮点击时设置: //发送数据方法1--简单型 i.putExtra("txt", "没错,我就是刚传来的信息!" ...

  7. HTTP 客户端接收数据超时

    本文使用两种方式测试HTTP 客户端读数据超时的情况,一种是直接使用golang自带的http库,另一种是使用martini web框架. 1. 测试1--直接使用http库 1.1.启动server ...

  8. Java实现RS485串口通信,发送和接收数据进行解析

    最近项目有一个空气检测仪,需要得到空气检测仪的实时数据,保存到数据库当中.根据了解得到,硬件是通过rs485进行串口通讯的,需要发送16进制命令给仪器,然后通过轮询来得到数据. 需要先要下载RXTX的 ...

  9. 我的Android进阶之旅------>Android实现用Android手机控制PC端的关机和重启的功能(三)Android客户端功能实现

    我的Android进阶之旅------>Android实现用Android手机控制PC端的关机和重启的功能(一)PC服务器端(地址:http://blog.csdn.net/ouyang_pen ...

随机推荐

  1. linux下获取线程号

    #include <sys/syscall.h> pid_t gettid() { return syscall(SYS_gettid); }

  2. IoC组件Unity再续~根据类型字符串动态生产对象

    回到目录 这个根据类型字符串动态去生产一个接口的对象,在实现项目中用途很广,这即省去了配置config文件的麻烦,又使用生产对象变更可配置,你完全可以把这种多态持久化到数据库里或者XML文件里,在使用 ...

  3. jQuery插件开发的五种形态[转]

    这篇文章主要介绍了jQuery插件开发的五种形态小结,具体的内容就是解决javascript插件的8种特征,非常的详细. 关于jQuery插件的开发自己也做了少许研究,自己也写过多个插件,在自己的团队 ...

  4. Atitit  代理与分销系统(1)  子代理 充值总额功能设计概览 sum() groubpy subagt

    Atitit  代理与分销系统(1)  子代理 充值总额功能设计概览 sum() groubpy subagt Keyword 分组与聚合操作. 一个for做分组...里面的做聚合... 数据g操作查 ...

  5. Design1:数据层次结构建模之一

    1,在现实世界中,有很多现象存在层次结构,公司的人事职称是典型的层次结果,如下图 Sql Server是关系型DB,适合存储二维关系的数据,如何存储具有层次结构的数据了?需要使用一个字段ParentI ...

  6. CSS滚动条

    × 目录 [1]条件 [2]默认 [3]尺寸[4]兼容[5]自定义 前面的话 滚动条在网页中经常见到,却并没有受到足够的重视.只有当因为滚动条的问题需要处理兼容性时,才进行调试操作.本文将就滚动条的常 ...

  7. 深入理解CSS变形transform(2d)

    × 目录 [1]变形原点 [2]变形函数 [3]多值 前面的话 CSS变形transform是一些效果的集合,主要是移动.旋转.缩放和倾斜这四种基本操作,还可以通过设置matrix矩阵来实现更复杂的效 ...

  8. poj1006生理周期(中国剩余定理)

    /* 中国剩余定理可以描述为: 若某数x分别被d1..….dn除得的余数为r1.r2.….rn,则可表示为下式: x=R1r1+R2r2+…+Rnrn+RD 其中R1是d2.d3.….dn的公倍数,而 ...

  9. CLR执行模型

    好好学习底层运行机制,从CLR via C# 开始. CLR的执行模型: CLR:Common Language Runtime,是一个可由多种编程语言使用的"运行时".CLR的核 ...

  10. layout_weight详解

    注:LinearLayout中的TextView按比例显示的时候,layout_width="0dp"或者layout_height="0dp" 在androi ...