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 ...
随机推荐
- Java-数组练习1
1.已知2个一维数组:a[]={3,4,5,6,7},b[]={1,2,3,4,5,6,7}:把数组a与数组b 对应的元素乘积再赋值给数组b,如:b[2]=a[2]*b[2]:最后输出数组b的元素. ...
- 知方可补不足~用SqlProfiler来监视数据库死锁
回到目录 关于锁的相关知识,大家可以看我的这篇文章<知方可补不足~Sqlserver中的几把锁和.net中的事务级别> 死锁我想大家都知道,当一个对话(线程)占用一个资源时,别一个线程也同 ...
- 爱上MVC系列~前端验证与后端数据有效性验证
回到目录 有一句话,在10年前就是真理,到现在也一直都是,“前端验证可以没有,但后端验证必须要有”,这句话相信大家都没有意见吧,前端验证一般指通过JS方式实现的,友好的,个性的验证方式,而后端验证是指 ...
- atitit 验证码理论与概览与 验证码规范 解决方案.docx
atitit 验证码理论与概览与 验证码规范 解决方案.docx 1.1. 验证码的前世今生1 1.2. 第三代:无知识型验证码1 1.3. 短信验证码1 1.4. 语言验证码1 1.5. 图片验证 ...
- DOM_06之定时器、事件、cookie
1.定时器:①任务函数:函数结尾判断临界值:②启动定时器:a.周期性:timer=setInterval(任务函数,interval):b.一次性:timer=setTimeout(任务函数,wait ...
- Linux下MakeFile初探
make是linux下的编译命令,用于编译和生成Linux下的可执行文件.这个命令处理的对象是Makefile,makefile等.由于make的强大解析能力,makefile文件的编写也变得极为简单 ...
- KnockoutJS 3.X API 第五章 高级应用(4) 自定义处理逻辑
在典型的Knockout应用程序中,DOM元素是动态添加和删除的,例如使用模板绑定或通过控制流绑定(if,ifnot,with和foreach). 当创建自定义绑定时,通常需要添加清除逻辑,当Knoc ...
- 最新hadoop+hbase+spark+zookeeper环境安装(vmmare下)
说明:我这里安装的版本是hadoop2.7.3,hbase1.2.4,spark2.0.2,zookeeper3.4.9 (安装包:链接:http://pan.baidu.com/s/1c25hI4g ...
- IE浏览器下常见的CSS兼容问题
目录 [1]宽高bug [2]边框bug [3]盒模型bug[4]列表项bug [5]浮动bug [6]定位bug [7]表单bug 宽高bug [1]IE6-浏览器下子元素能撑开父级设置好的宽高 & ...
- 2014牡丹江网络赛ZOJPretty Poem(暴力枚举)
/* 将给定的一个字符串分解成ABABA 或者 ABABCAB的形式! 思路:暴力枚举A, B, C串! */ 1 #include<iostream> #include<cstri ...