SSH服务器与Android通信(2)--Android客户端接收数据
基本原理是Android客户端通过HttpClient向服务器发出请求,服务器向Android客户端返回JSON字符串,Android客户端解析JSON字符串获得数据。
1. 新建一个Android项目,主要文件如下:
其中MainActivity是UI,CommThread是通信线程,负责和服务器通信,Util是工具类,Var存放变量。
2. Var.java:
- package com.hzhi.school.util;
- import java.util.ArrayList;
- import java.util.List;
- public class Var {
- // 访问的URL
- public static String strHost = new String("http://192.168.1.100:8080/School/");
- public static String strAct = new String("aclasquery");
- public static String strURL = strHost + strAct;
- // 列表
- public static List lstId = new ArrayList();
- public static List lstName = new ArrayList();
- public static List lstComm = new ArrayList();
- // 屏幕的尺寸
- public static int wid_scr;
- public static int hei_scr;
- // 消息类型
- public static final int msg_connect = 1;
- public static final int msg_error = 2;
- public static final int msg_con_start = 3;
- public static final int msg_con_stop = 4;
- }
3. Util.java:
- package com.hzhi.school.util;
- import java.io.BufferedReader;
- import java.io.InputStream;
- import java.io.InputStreamReader;
- import org.json.JSONArray;
- import org.json.JSONException;
- import org.json.JSONObject;
- import android.util.Log;
- public class Util {
- // 构造类
- public Util(){
- }
- // 将InputStream格式转化为StringBuilder格式
- public static StringBuilder is2sb (InputStream is) {
- String ln = "";
- StringBuilder sb = new StringBuilder();
- BufferedReader br = new BufferedReader(new InputStreamReader(is));
- try{
- while ((ln=br.readLine()) != null){
- sb.append(ln);
- }
- }catch(Exception e){
- e.printStackTrace();
- }
- return sb;
- }
- // JSON转换成List
- public static void json2list(String strJson) throws JSONException {
- JSONObject jsonObject = new JSONObject(strJson);
- JSONArray jsonClas = jsonObject.getJSONArray("Classes");
- for (int i=0; i<jsonClas.length(); i++){
- Var.lstId.add(i, jsonClas.getJSONObject(i).getString("id"));
- Var.lstName.add(i, jsonClas.getJSONObject(i).getString("name"));
- Var.lstComm.add(i, jsonClas.getJSONObject(i).getString("comment"));
- }
- }
- }
4. CommThread.java:
- package com.hzhi.school.comm;
- import java.io.InputStream;
- import java.util.ArrayList;
- import java.util.List;
- import org.apache.http.HttpResponse;
- import org.apache.http.client.HttpClient;
- import org.apache.http.client.methods.HttpGet;
- import org.apache.http.impl.client.DefaultHttpClient;
- import android.os.Bundle;
- import android.os.Message;
- import android.util.Log;
- import com.hzhi.school.MainActivity;
- import com.hzhi.school.util.Util;
- import com.hzhi.school.util.Var;
- public class CommThread extends Thread{
- // 消息变量
- private Message msg;
- private Bundle bdl;
- // 构造函数
- public void run(){
- InputStream resIS;
- StringBuilder resSB;
- String resStr;
- resIS = getIS(Var.strURL);
- if (resIS == null)
- {
- return;
- }
- else
- {
- resSB = Util.is2sb(resIS);
- resStr = resSB.toString();
- try{
- Util.json2list(resStr);
- sendMessage(Var.msg_connect,"");
- }catch (Exception e){
- e.printStackTrace();
- sendMessage(Var.msg_error,e.toString());
- }
- }
- }
- // 通过GET方法获取信息
- public InputStream getIS (String url){
- InputStream is=null;
- try{
- // 取得默认HttpClient实例
- HttpClient hc = new DefaultHttpClient();
- // 连接到服务器
- HttpResponse hr = hc.execute(new HttpGet(url));
- // 获取数据内容
- is = hr.getEntity().getContent();
- }catch (Exception e){
- e.printStackTrace();
- sendMessage(Var.msg_error,e.toString());
- }
- return is;
- }
- // 发送消息(用于更新UI)
- public void sendMessage(int x, String s){
- msg = new Message();
- bdl = new Bundle();
- bdl.putString("1",s);
- msg.what = x;
- msg.setData(bdl);
- MainActivity.mainHandler.sendMessage(msg);
- }
- }
使用HttpClient向服务器发出请求,服务器返回的是一个InputStream,调用Util里面的函数将InputStream转换成StringBuilder,获得JSON字符串,再解析JSON字符串,获得数据。
5. MainActivity.java:
- package com.hzhi.school;
- import java.util.ArrayList;
- import java.util.List;
- import android.app.ListActivity;
- import android.app.ProgressDialog;
- import android.content.Context;
- import android.graphics.Typeface;
- import android.os.Bundle;
- import android.os.Handler;
- import android.os.Message;
- import android.util.Log;
- import android.view.Gravity;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.view.ViewGroup;
- import android.widget.BaseAdapter;
- import android.widget.Button;
- import android.widget.LinearLayout;
- import android.widget.ListView;
- import android.widget.TextView;
- import android.widget.Toast;
- import com.hzhi.school.comm.CommThread;
- import com.hzhi.school.util.Var;
- public class MainActivity extends ListActivity{
- static list_clas_adaptor myAdaptor;
- static Context mCtx;
- static ProgressDialog progressDialog;
- static Toast toast;
- CommThread myThread;
- static int numGet = 0;
- ListView lv;
- int id;
- item_clas it;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_list_clas);
- mCtx = getApplicationContext();
- getScreen();
- myAdaptor = new list_clas_adaptor(this);
- progressDialog = ProgressDialog.show(MainActivity.this,
- "连接", "正在连接服务器:" + Var.strURL, true, false);
- setListAdapter(myAdaptor);
- myThread = new CommThread();
- myThread.start();
- }
- protected void onListItemClick(ListView l, View v, int position, long id) {
- id = Integer.parseInt((String) myAdaptor.list_data.get(position).txtNum.getText());
- it = (item_clas) myAdaptor.getItem((int)id);
- super.onListItemClick(l, v, position, id);
- }
- // 获得课程列表
- public static void getData(){
- myAdaptor.list_data.clear();
- if (Var.lstId.size()>0){
- for (int i=0; i<Var.lstId.size(); i++){
- myAdaptor.addItem(Var.lstId.get(i).toString(),
- Var.lstName.get(i).toString(), Var.lstComm.get(i).toString(), 1);
- }
- }
- numGet++;
- }
- // 消息处理Handler
- public static Handler mainHandler = new Handler() {
- public void handleMessage(Message msg) {
- switch (msg.what)
- {
- // 出错
- case Var.msg_error:
- toast = Toast.makeText(mCtx,
- "错误:" + msg.getData().getString("1"), Toast.LENGTH_LONG);
- toast.show();
- break;
- // 已连接成功
- case Var.msg_connect:
- progressDialog.dismiss();
- getData();
- myAdaptor.notifyDataSetChanged();
- toast = Toast.makeText(mCtx,
- "连接服务器并返回数据成功!", Toast.LENGTH_LONG);
- toast.show();
- break;
- }
- super.handleMessage(msg);
- }
- };
- // 获得屏幕尺寸
- public void getScreen(){
- Var.wid_scr = getWindowManager().getDefaultDisplay().getWidth();
- Var.hei_scr = getWindowManager().getDefaultDisplay().getHeight();
- }
- }
- //课程列表
- class list_clas_adaptor extends BaseAdapter implements OnClickListener{
- public Context ctx;
- public List<item_clas> list_data;
- public String s1, s2;
- public list_clas_adaptor(Context context){
- ctx =context;
- list_data = new ArrayList<item_clas>();
- }
- @Override
- public int getCount() {
- // TODO Auto-generated method stub
- return list_data.size();
- }
- @Override
- public Object getItem(int id) {
- // TODO Auto-generated method stub
- s2 = String.valueOf(id);
- for (int i=0; i<list_data.size(); i++){
- s1 = (String) list_data.get(i).txtNum.getText();
- if (s1.equals(s2))
- return list_data.get(i);
- }
- return null;
- }
- @Override
- public long getItemId(int position) {
- // TODO Auto-generated method stub
- return list_data.indexOf(position);
- }
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- // TODO Auto-generated method stub
- item_clas my_item;
- if (convertView == null)
- {
- my_item = new item_clas(ctx,
- (String)list_data.get(position).txtNum.getText(),
- (String)list_data.get(position).txtName.getText(),
- (String)list_data.get(position).txtComm.getText()
- ,1);
- }
- else
- {
- my_item = (item_clas)convertView;
- my_item.txtNum.setText(list_data.get(position).txtNum.getText());
- my_item.txtName.setText(list_data.get(position).txtName.getText());
- my_item.txtComm.setText(list_data.get(position).txtComm.getText());
- }
- // 点击删除按钮
- my_item.btnDel.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- } });
- // 点击修改按钮
- my_item.btnMdf.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- }
});- return my_item;
- }
- public void addItem(String num, String name, String comm, int x)
- {
- list_data.add(new item_clas(ctx, num, name, comm, x));
- }
- @Override
- public void onClick(View v) {
- }
- }
- // clas列表的一行
- class item_clas extends LinearLayout{
- public TextView txtNum;
- public TextView txtName;
- public TextView txtComm;
- public TextView txtMdf;
- public TextView txtDel;
- public Button btnMdf;
- public Button btnDel;
- public item_clas(Context ctx, String num, String name, String comm, int x)
- {
- super(ctx);
- this.setOrientation(HORIZONTAL);
- int hei = 60;
- txtNum = new TextView(ctx);
- txtNum.setText(num);
- txtNum.setGravity(Gravity.CENTER);
- txtNum.setTypeface(Typeface.DEFAULT_BOLD, Typeface.BOLD);
- addView(txtNum, new LinearLayout.LayoutParams((int)(Var.wid_scr*0.1),hei));
- txtName = new TextView(ctx);
- txtName.setText(name);
- txtName.setGravity(Gravity.CENTER);
- txtName.setTypeface(Typeface.DEFAULT_BOLD, Typeface.BOLD);
- addView(txtName, new LinearLayout.LayoutParams((int)(Var.wid_scr*0.2),hei));
- txtComm = new TextView(ctx);
- txtComm.setText(comm);
- Gravity g = new Gravity();
- txtComm.setGravity(Gravity.LEFT);
- addView(txtComm, new LinearLayout.LayoutParams((int)(Var.wid_scr*0.4),hei));
- if (x==0){
- txtDel = new TextView(ctx);
- txtDel.setText("删除");
- txtDel.setGravity(Gravity.CENTER);
- addView(txtDel, new LinearLayout.LayoutParams((int)(Var.wid_scr*0.15),hei));
- Log.i("addView", txtDel.getText().toString());
- txtMdf = new TextView(ctx);
- txtMdf.setText("更新 ");
- txtMdf.setGravity(Gravity.CENTER);
- addView(txtMdf, new LinearLayout.LayoutParams((int)(Var.wid_scr*0.15),hei));
- Log.i("comm=", comm);
- Log.i("addView", txtMdf.getText().toString());
- }
- else{
- btnDel = new Button(ctx);
- btnDel.setText("删除");
- btnDel.setGravity(Gravity.CENTER);
- btnDel.setTypeface(Typeface.DEFAULT_BOLD, Typeface.BOLD);
- btnDel.setFocusable(false);
- addView(btnDel, new LinearLayout.LayoutParams((int)(Var.wid_scr*0.15),hei));
- btnMdf = new Button(ctx);
- btnMdf.setText("更新");
- btnMdf.setGravity(Gravity.CENTER);
- btnMdf.setTypeface(Typeface.DEFAULT_BOLD, Typeface.BOLD);
- btnMdf.setFocusable(false);
- addView(btnMdf, new LinearLayout.LayoutParams((int)(Var.wid_scr*0.15),hei));
- }
- }
- }
MainActivity调用CommThread访问服务器,获得数据后通过BaseAdaptor显示出来。在item_clas类中,由于点击每一行会被系统误以为是在点击Button,所以要给Button加上:
- setFocusable(false);
运行结果:
SSH服务器与Android通信(2)--Android客户端接收数据的更多相关文章
- 使用Socket通信实现Silverlight客户端实时数据的获取(模拟GPS数据,地图实时位置)
原文:使用Socket通信实现Silverlight客户端实时数据的获取(模拟GPS数据,地图实时位置) 在上一篇中说到了Silverlight下的Socket通信,在最后的时候说到本篇将会结合地图. ...
- SSH服务器与Android通信(3)--Android客户端发送数据
Android客户端向SSH服务器发送数据主要有三种情况:通过客户端删除数据.添加数据和修改数据. 1.删除数据 先看看jsp文件里面是怎样删除数据的: <td align="cent ...
- Android笔记:Socket客户端收发数据
client.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" and ...
- Java Socket 服务端发送数据 客户端接收数据
服务端: package com.thinkgem.wlw.modules.api.test.socket; /** * @Author: zhouhe * @Date: 2019/4/8 9:30 ...
- android socket 通讯(客户端) 发送数据
/** ClientSocket通讯类 **/ public class ClientSocket { /**服务器地址*/ private String serverUrl=&q ...
- android中如何发送及接收数据(两种方法)?
1.如在MainActivity.java中的按钮点击时设置: //发送数据方法1--简单型 i.putExtra("txt", "没错,我就是刚传来的信息!" ...
- HTTP 客户端接收数据超时
本文使用两种方式测试HTTP 客户端读数据超时的情况,一种是直接使用golang自带的http库,另一种是使用martini web框架. 1. 测试1--直接使用http库 1.1.启动server ...
- Java实现RS485串口通信,发送和接收数据进行解析
最近项目有一个空气检测仪,需要得到空气检测仪的实时数据,保存到数据库当中.根据了解得到,硬件是通过rs485进行串口通讯的,需要发送16进制命令给仪器,然后通过轮询来得到数据. 需要先要下载RXTX的 ...
- 我的Android进阶之旅------>Android实现用Android手机控制PC端的关机和重启的功能(三)Android客户端功能实现
我的Android进阶之旅------>Android实现用Android手机控制PC端的关机和重启的功能(一)PC服务器端(地址:http://blog.csdn.net/ouyang_pen ...
随机推荐
- linux下获取线程号
#include <sys/syscall.h> pid_t gettid() { return syscall(SYS_gettid); }
- IoC组件Unity再续~根据类型字符串动态生产对象
回到目录 这个根据类型字符串动态去生产一个接口的对象,在实现项目中用途很广,这即省去了配置config文件的麻烦,又使用生产对象变更可配置,你完全可以把这种多态持久化到数据库里或者XML文件里,在使用 ...
- jQuery插件开发的五种形态[转]
这篇文章主要介绍了jQuery插件开发的五种形态小结,具体的内容就是解决javascript插件的8种特征,非常的详细. 关于jQuery插件的开发自己也做了少许研究,自己也写过多个插件,在自己的团队 ...
- Atitit 代理与分销系统(1) 子代理 充值总额功能设计概览 sum() groubpy subagt
Atitit 代理与分销系统(1) 子代理 充值总额功能设计概览 sum() groubpy subagt Keyword 分组与聚合操作. 一个for做分组...里面的做聚合... 数据g操作查 ...
- Design1:数据层次结构建模之一
1,在现实世界中,有很多现象存在层次结构,公司的人事职称是典型的层次结果,如下图 Sql Server是关系型DB,适合存储二维关系的数据,如何存储具有层次结构的数据了?需要使用一个字段ParentI ...
- CSS滚动条
× 目录 [1]条件 [2]默认 [3]尺寸[4]兼容[5]自定义 前面的话 滚动条在网页中经常见到,却并没有受到足够的重视.只有当因为滚动条的问题需要处理兼容性时,才进行调试操作.本文将就滚动条的常 ...
- 深入理解CSS变形transform(2d)
× 目录 [1]变形原点 [2]变形函数 [3]多值 前面的话 CSS变形transform是一些效果的集合,主要是移动.旋转.缩放和倾斜这四种基本操作,还可以通过设置matrix矩阵来实现更复杂的效 ...
- poj1006生理周期(中国剩余定理)
/* 中国剩余定理可以描述为: 若某数x分别被d1..….dn除得的余数为r1.r2.….rn,则可表示为下式: x=R1r1+R2r2+…+Rnrn+RD 其中R1是d2.d3.….dn的公倍数,而 ...
- CLR执行模型
好好学习底层运行机制,从CLR via C# 开始. CLR的执行模型: CLR:Common Language Runtime,是一个可由多种编程语言使用的"运行时".CLR的核 ...
- layout_weight详解
注:LinearLayout中的TextView按比例显示的时候,layout_width="0dp"或者layout_height="0dp" 在androi ...