Android手机客户端和服务器交互开发实例

合集下载

C++使用binder实例

C++使用binder实例

C++使⽤binder实例Android系统最常见也是初学者最难搞明⽩的就是Binder了,很多很多的Service就是通过Binder机制来和客户端通讯交互的。

所以搞明⽩Binder的话,在很⼤程度上就能理解程序运⾏的流程。

这是⼀个⽤C++写的binder,⼀个服务器⼀恶搞客户端,代码如下:server.cpp1 #include <binder/IServiceManager.h>2 #include <binder/IBinder.h>3 #include <binder/Parcel.h>4 #include <binder/ProcessState.h>5 #include <binder/IPCThreadState.h>6 #include <android/log.h>7using namespace android;8 #ifdef LOG_TAG9#undef LOG_TAG10#endif11#define LOG_TAG "testService"1213#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, "ProjectName", __VA_ARGS__)14#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG , "ProjectName", __VA_ARGS__)15#define LOGI(...) __android_log_print(ANDROID_LOG_INFO , "ProjectName", __VA_ARGS__)16#define LOGW(...) __android_log_print(ANDROID_LOG_WARN , "ProjectName", __VA_ARGS__)17#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR , "ProjectName", __VA_ARGS__)1819class MyService : public BBinder20 {21public:22 MyService()23 {24 mydescriptor = String16("media.hello");25 n=0;26 }27virtual ~MyService() {}28//This function is used when call Parcel::checkInterface(IBinder*)29virtual const String16& getInterfaceDescriptor() const30 {31 LOGE("this is enter ==========getInterfaceDescriptor");32return mydescriptor;33 }34protected:35void show()36 {37 LOGE("this is for test show");38 LOGE("this is for test show");39 LOGE("this is for test show");40 LOGE("this is for test show");41 LOGE("this is for test show");42 }43virtual status_t onTransact( uint32_t code,const Parcel& data,Parcel* reply,uint32_t flags = 0)44 {45 LOGD("enter MyService onTransact and the code is %d",code);46/*47 if (data.checkInterface(this))48 LOGD("checkInterface OK");49 else50 {51 LOGW("checkInterface failed");52 return BBinder::onTransact(code, data, reply, flags);53 }54*/55switch (code)56 {57case1:58 LOGD("MyService interface 1");59break;60case2:61 LOGD("MyService interface 2");62 cb = data.readStrongBinder();63break;64case3:65 {66 LOGD("MyService interface 3, exit");67//No unregister service routine?68//It should return to client first and then call exit in another place.69 exit(0);70break;71 }72case4:73 {//call cb74 LOGD("MyService interface 4 before if================");75 cb = data.readStrongBinder();76if (cb != NULL)77 {78 LOGD("MyService interface 4");79 Parcel in, out;80in.writeInterfaceToken(String16("android.os.ISetupCallback"));81in.writeInt32(n++); //向客户端发送数据8283in.writeCString("This is a string !");84 cb->transact(2, in, &out, 0);85 show();86 }87break;88 }89default:90return BBinder::onTransact(code, data, reply, flags);91 }92return0;93 }94private:95 String16 mydescriptor;96 sp<IBinder> cb;97int n;98 };99int main()100 {101 sp<IServiceManager> sm = defaultServiceManager(); //获取ServiceManager服务代理102 status_t ret;103//register MyService to ServiceManager104 MyService* srv = new MyService();105 ret = sm->addService(String16("media.hello"), srv); // 注册服务106 LOGD("addservice media.hello return %d", ret);107//call binder thread pool to start108 ProcessState::self()->startThreadPool();109 IPCThreadState::self()->joinThreadPool(true); //参数默认也是true,进⼊服务的循环监听状态110return0;111 }clinet.cpp1 #include <binder/IServiceManager.h>2 #include <binder/IBinder.h>3 #include <binder/Parcel.h>4 #include <binder/ProcessState.h>5 #include <binder/IPCThreadState.h>6 #include <private/binder/binder_module.h>7 #include <android/log.h>89using namespace android;10 #ifdef LOG_TAG11#undef LOG_TAG12#endif13#define LOG_TAG "testCallback"1415#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, "ProjectName", __VA_ARGS__)16#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG , "ProjectName", __VA_ARGS__)17#define LOGI(...) __android_log_print(ANDROID_LOG_INFO , "ProjectName", __VA_ARGS__)18#define LOGW(...) __android_log_print(ANDROID_LOG_WARN , "ProjectName", __VA_ARGS__)19#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR , "ProjectName", __VA_ARGS__)2021class MySetupCallback : public BBinder22 {23public:24 MySetupCallback()25 {26 mydescriptor = String16("android.os.ISetupCallback");27 }28virtual ~MySetupCallback() {}29virtual const String16& getInterfaceDescriptor() const30 {31return mydescriptor;32 }33protected:34virtual status_t onTransact( uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags = 0)35 {36 LOGD("enter MySetupCallback onTransact, code=%u", code);37if (data.checkInterface(this)) //检查 mydescriptor 类描述字符串38 LOGD("checkInterface OK");39else40 {41 LOGW("checkInterface failed");42return -1;43 }44switch (code) //code为服务器发送的code,根据code实现不同的函数45 {46case1:47 LOGD("From Server code = %u", code);48 LOGD("From Server code = %u", code);49break;50case2:51 {52 LOGD("From Server code = %u", code);53 LOGD("Frome server data = %d", data.readInt32()); //从服务端接收数据54 LOGD("Frome server string = %s", data.readCString());5556break;57 }58default:59break;60 }61return0;62 }63private:64 String16 mydescriptor;65 };6667int main()68 {69 sp<IServiceManager> sm = defaultServiceManager(); //获取ServiceManager服务代理70 sp<IBinder> b = sm->getService(String16("media.hello")); //查询服务71if (b == NULL)72 {73 LOGW("Can't find binder service \"media.hello\"");74return -1;75 }76 Parcel in1,out1;77 MySetupCallback *cb = new MySetupCallback();78 in1.writeStrongBinder(sp<IBinder>(cb));79int ret = b->transact(4, in1, &out1, 0); //TRANSACTION_registerSetup = 480 LOGD("transact(4) return %d", ret);81 ProcessState::self()->startThreadPool();82 IPCThreadState::self()->joinThreadPool(); //参数默认也是true,进⼊服务的循环监听状态83return0;84 }Android.mk# Copyright 2006 The Android Open Source ProjectLOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)LOCAL_SHARED_LIBRARIES := \libcutils \libbinder \libutils \libhardwareLOCAL_SRC_FILES:= client.cppLOCAL_MODULE_TAGS = eng testsLOCAL_MODULE:= testClientinclude $(BUILD_EXECUTABLE)include $(CLEAR_VARS)LOCAL_SHARED_LIBRARIES := \libcutils \libbinder \libutils \libhardwareLOCAL_SRC_FILES:=server.cppLOCAL_MODULE:= testServerLOCAL_MODULE_TAGS = eng testsinclude $(BUILD_EXECUTABLE)客户端运⾏结果如下:以上代码参考别⼈写的做了点修改,有错误的地⽅欢迎指出来,谢谢。

基于Android平台的云相册系统设计与实现

基于Android平台的云相册系统设计与实现

基于Android平台的云相册系统设计与实现作者:陈志伟李天福来源:《软件导刊》2013年第10期摘要:随着云计算技术的不断发展,其应用也已延伸到生活的各个领域。

作为一种技术手段和实现模式,云计算使得计算资源成为向大众提供服务的社会基础设施,其目的是实现资源分享与整合。

依托云服务的设计思想,选用Google提供的GAE云平台,结合移动终端上的Android系统,分析并设计了云相册系统,实现了个人相片的“即拍即存即取”功能。

关键词:云计算;Android平台;个人相册;云相册中图分类号:TP319文献标识码:A文章编号文章编号:16727800(2013)0010007003作者简介:陈志伟(1984-),男,硕士,福建教育学院图书资料与网络管理中心工程师,研究方向为计算机应用;李天福(1983-),男,硕士,福建教育学院教务处助理研究员,研究方向为软件开发与应用。

0引言随着互联网、移动互联网以及物联网技术的迅速发展、应用和普及,云计算已经成为新兴技术产业中最热门的领域之一,其应用也延伸到生活的各个方面。

相对于传统模式,云计算模式有着更低的硬件、网络和管理成本,同时拥有更高的资源利用率。

因此,国内外众多的知名公司纷纷推出自己的云计算平台,如Google提供的Google App Engine(GAE)就是一个开发、托管网络应用程序的云平台。

本研究将依托云服务的设计思想,结合移动终端上的Android系统,分析设计并实现个人云相册系统,以满足用户“即拍即存即取”相片、文字数据的需求,避免用户在更换移动终端或者信息误删情况下而造成数据丢失,并能通过云服务器的无限存储容量、高性能计算能力等优点,解决移动终端内存不足问题。

1系统服务端分析与设计云相册系统服务端主要实现用户相片存储、管理和响应查询浏览功能。

1.1平台选择系统服务端选择Google提供的GAE云平台,它使用Google的管理数据中心,提供多种云服务,如网址获取、邮件、内存缓存、图片操作等。

基于Android平台的记事本App的开发与实现

基于Android平台的记事本App的开发与实现

第35卷第12期2020年12月/黑亠评紅芳F2学报Journal of Leshan Normal UniversityNo.12Vol.35Dec.,2020DOI:10.16069/ki.51-1610/g4.2020.12.008基于Android平台的记事本App的开发与实现江志华1,陈翱天2(1.乐山师范学院人工智能学院,四川乐山614000; 2.北京交通大学计算机与信息技术学院,北京100044)摘要:文章介绍了基于Android的智能终端完成记事本App客户端及服务端的开发与实现过程。

该App基于MVC 模式,使用fragment,sqlite等技术,实现了信息的富文本编辑与查询、用户注册与登录、信息上传至服务器、PC端的后台管理等功能。

记事本App的使用,丰富了人们记录内容的形式,提高了记录信息的效率,为工作和生活提供了便利。

关键词:Java;Android;MySQL;系统实现中图分类号:TP311.1文献标志码:A文章编号:1009-8666(2020)12-0049-060引言随着移动互联网的发展,移动智能终端设备在人们工作生活中起着越来越重要的作用。

在人们日常学习和工作中经常需要快速高效地记录许多信息,然而传统的记录方式已经满足不了这种需求,因此开发一款能够便捷、高效运行在移动智能终端设备上的记事本App变得很有必要[1]。

在文献[1]中作者利用语音识别以及合成技术将语音转换成文字,通过云存储技术存储用户的笔记数据,设计实现了一款语音云记事本软件。

在文献[2-5]中作者仅实现了记事本文本增删改查、检索以及信息分享、同步等基本功能。

现有记事本App大多只实现了基本的信息记录功能,功能较单一,记录的信息类型也仅限于文本类信息;缺少用户身份验证功能,存在一定的安全隐患,一旦用户的安卓设备丢失,用户的笔记数据就可能会泄漏。

本文开发实现的记事本App集多种功能于一体,在实现信息记录基本功能的基础上,还实现了用户安全验证、信息云备份等功能。

Android手机访问服务器的一种数据交互方法

Android手机访问服务器的一种数据交互方法

3、接收数据
3、接收数据
接收服务器响应的数据是数据交互的另一个关键步骤。Android应用程序可以 通过解析HTTP响应来获取服务器返回的数据。常见的数据格式包括JSON、XML和 纯文本等。在解析数据时,需要遵循服务器端返回的数据格式,以便正确解析和 显示数据。
四、优点
本节将分析Android手机访问服 务器的方法的优点。
本节将分析Android手机访问服务器的方法的优点。
1、提高效率:通过访问服务器,Android应用程序可以实时获取最新的数据, 从而提高用户体验和应用程序的效率。
本节将分析Android手机访问服务器的方法的优点。
2、降低成本:与本地存储相比,访问服务器可以减少存储空间的需求,降低 应用程序的成本。
一、引言
一、引言
Android操作系统是目前市场份额最大的移动操作系统之一,拥有庞大的用户 群体和丰富的应用生态。对于Android手机用户来说,访问服务器已成为应用程 序的基本需求。本次演示将介绍一种简单易行的方法,帮助Android手机应用程 序实现与服务器之间的数据交互。
二、背景
二、背景
三、方法
1、打开服务器端口
1、打开服务器端口
首先,需要打开服务器的网络端口,以供手机应用程序访问。服务器端口可 以使用防火墙进行保护,确保只有授权的设备或应用程序可以访问。在Android 应用程序中,可以使用HTTP或HTTPS协议,通过URL访问输数据
数据传输是手机应用程序与服务器之间的重要环节。在HTTP协议下,可以通 过请求和响应的方式进行数据传输。Android应用程序可以使用各种网络库,如 OkHttp、Volley或Retrofit等,向服务器发送请求并接收响应。数据传输通常 包括GET和POST两种方式,其中GET请求适用于获取数据,而POST请求适用于上传 数据。

基于Android手机的远程视频监控系统的设计与开发

基于Android手机的远程视频监控系统的设计与开发

4、数据存储与备份
4、数据存储与备份
远程视频监控系统会产生大量的监控数据,因此需要考虑数据存储与备份方 案。在开发过程中,需要选择合适的存储设备和存储方案,确保数据的安全性和 可靠性。同时,需要考虑数据备份和恢复机制,避免数据丢失或损坏。此外,需 要考虑数据的隐私和保密问题,确保用户隐私得到保护。
7、报警模块
7、报警模块
报警模块负责检测监控区域内的异常情况,如移动物体、人脸识别等。一旦 检测到异常,系统将立即发出警报信息给用户,同时将报警信息存储到本地和云 端。
7、报警模块
系统实现 1、摄像头模块实现过程与技术:使用Android摄像头API进行视频采集,采 用H.264标准对视频进行压缩编码。
1、总体架构
1、总体架构
基于Android智能手机的远程视频监控系统主要由摄像头模块、数据处理模块、 网络传输模块、存储模块、控制模块和报警模块组成。
2、摄像头模块
2、摄像头模块
摄像头模块负责采集监控区域的视频画面。为满足实时性需求,本系统采用 H.264视频编码标准进行压缩,降低视频传输的带宽要求。
5、存储模块
5、存储模块
存储模块负责将视频数据存储在本地和云端,方便用户在需要时进行回看或 备份。本系统采用NVMe SSD硬盘进行本地存储,同时使用云存储备份数据,提高 数据安全性和可用性。
ቤተ መጻሕፍቲ ባይዱ
6、控制模块
6、控制模块
控制模块负责接收用户在远程客户端发出的指令,对监控设备进行控制,如 调整镜头角度、云台旋转等。本系统采用WebSocket协议进行指令传输,实现实 时控制。
5、系统安全与稳定性
5、系统安全与稳定性
远程视频监控系统涉及到用户的隐私和安全问题,因此需要充分考虑系统安 全与稳定性。在开发过程中,需要采用加密技术和安全措施,确保数据传输和存 储的安全性。需要考虑系统的稳定性和可靠性,避免因设备故障或网络问题导致 系统瘫痪或数据

c++与android通讯

c++与android通讯

今天晚上11点半,在学校断网后的十分钟,我终于实现了C++服务器端与Android客户端的通信。

本来很简单的一件事,却因为Android Socket线程阻塞的问题弄了我两天。

好了不多说,直接进入主题:C++ 服务器端:用C++进行网络编程有很多方式,比如可以使用winSock,winInt,或者使用MFC的封装类CSocket等等。

这里我使用的是比较简单的CSocket类来实现。

这里先简单说说使用CSocket类来建立服务器端的过程:上图是C++服务器端与Android客户端通信的流程图。

看到上面的流程图,C++程序员应该感到高兴,这不就是CSocket客户端的变体嘛。

服务器端完全没变化,这先不说,Android客户端连connet动作都省下来了。

这……是不是写错了?没错,确实连connet这个步骤都省了。

当然,没有connect只不过是因为这个connect 的动作直接被封装到了Android Socket的new操作里而已。

不然,服务器端怎么可能知道你这个狡猾的客户端会不会三更半夜的来敲门,说要提供服务啊。

哈哈。

注:在Android Socket的构造函数中有多种形式,并不是每一种形式都必须在构造时就连接到服务器。

读者可以自己阅读Android的开发文档,你会发现Socket也有个名为Connect的成员函数。

好了,有了基本的操作流程后,写起代码来就容易多了。

观察流程图中C++服务器端的构造过程可以知道,服务器端的构造大致分为三大步骤:1、创建用于侦听的socket套接字sevSock并开启侦听;2、创建用于接收/发送信息的socket套接字reveiceSoc,创建后“绑定”到侦听套接字;3、reveiceSoc套接字接收/发送信息。

这几个步骤对于C++程序员来说已经是滚瓜烂熟了。

我也不多说,直接动手更见效。

(开发环境:VS 2008)第一步:创建一个新MFC应用程序项目,这里名为AndroidSocket,应用程序类型为“基于对话框”就可以了。

基于Qt on Android平台的空气质量监测系统手机客户端设计

基于Qt on Android平台的空气质量监测系统手机客户端设计

基于Qt on Android平台的空气质量监测系统手机客户端设计作者:曹龙刘炜曾力来源:《电子技术与软件工程》2017年第02期摘要利用Qt on Android平台设计出了一种针对空气质量监测系统的Android手机客户端,该客户端实现了手机与服务器的信息交互,使得用户可以通过手机方便快捷的查询选定监测端当前的空气质量数据,实现了室内环境监测的网络化。

同时为C/C++程序员在Android平台开发APP提供了范例。

【关键词】Qt on Android 空气质量监测 C/S XML1 引言Android平台已成为智能手机领域举足轻重的平台,由于其只支持Java开发应用,对C/C++开发的支持有限,大多数C/C++程序员若想进行Android平台的开发只好转型。

而Qt on Android的出现为众多C/C++程序员提供了福音。

利用Qt Creator可以轻松将Qt程序部署到Android平台上,从而实现Qt在Android平台上的应用。

笔者设计了一种针对空气质量监测系统的Android手机客户端,为操作人员提供更加灵活的环境监测手段,随时获取环境信息。

2 手机客户端的软件功能空气质量监测系统手机客户端的主要作用是按照用户的需求,向服务器发出相应的请求,从而获取当前室内的温度、湿度、光照强度、PM2.5和氨硫类气体等环境数据信息,并对数据进行解析后存储,通过相应的控件在手机上显示出来,从而实现室内环境监测的网络化、智能化。

手机客户端软件主要由用户登录模块、用户注册模块、通信设置模块、室内环境数据显示界面,数据曲线绘制模块等组成。

其结构如图1所示。

登录模块:主要实现用户的登录功能。

当手机客户端发出登录请求后,服务器匹配用户数据库的信息,若匹配成功,则返回登录成功的指令,进入数据显示界面。

注册模块:为用户提供注册功能。

用户确定注册信息后,服务器将用户名和密码信息查询用户数据库中用户是否已存在,若用户名不存在,则完成注册,否则提示用户出错。

安卓开发心得5篇最新实例

安卓开发心得5篇最新实例

安卓开发心得5篇最新实例android开发是指android平台上应用的制作,Android早期由“Android之父”之称的Andy Rubin创办。

下面给大家带来一些关于安卓开发心得,希望对大家有所帮助。

安卓开发心得1时间飞快,转眼毕设实训已经结束,我们也完成了所选的项目任务。

从实训开始到现在,经历了三个多月的时间,在这段时间里,我们着手安卓应用程序开发,刚开始接触Android感觉到它很有意思,在界面开发上和web也可以形成了相通的架构,更加方便,视觉上也是非常的酷,在前期我通过的大量的Android SDK开发范例大全中的例子以及Android提供的APIDEMOS进行学习,尽管例子之间的连接比较零散,不过通过这些例子的学习我可以学习到了很多和以前java上相通的思想。

我在为期半个月的实习中学到了很多在课堂上根本就学不到的知识,收益非浅.现在我对这半个月的实习做一个工作小结。

1通过半个月的android实习,基本掌握了Android应用程序开发的一般流程。

对常用控件基本掌握其用法,对其事件的监听方法也基本掌握。

学习Android不仅是对前沿开发技术的了解,也是对编程知识的一次提升。

2通过学习Android的控件、布局、Activity、Service等一系列基础知识,对整个Android的开发有了大致的了解。

例如: 要的布局(或者控件) ,在学习界面中,我发现Android为我们提供了很好的类似反射机制,通过Layout文件夹下的配置文件,可以快速的形成界面,在配置文件可以设置属性或者样式都是很快捷方便。

对比较特殊的界面也可以通过处理嵌入到指定的界面,同样你可以通过java代码直接创建View进行添加,不过这种方式比较复杂。

对一些点击、选中、按键等处理的事件,界面之间的跳转Intent管理,通过Bundle对数据在界面之间进行传输。

4在手机交互式通信服务中,学习了Android手机之间进行短信发送、广播、对广播的监听、服务等,在Service类中没有conte_t,可以通过Handler来每秒反复运行,自动送出系统广播信息,同时在这里我们也知道可以设计一个常用的变量类,设计一个当前的CurrentActivity这个变量进行控制,进行处理。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

本文介绍了如何使用Android搭建客户端,实现手机和服务器的交互。

让我们了解如何采用SSH框架,把服务器端的信息用JSON的形式发送到手机端。

AD:笔者以前是学的Java EE,由于项目需要要开发Android,所以临时补了一个多星期,主要是手机端和服务器端交互,双向开发的。

首先在服务器端,我采用的是SSH框架,struts 2集合了JSON插件,服务器和客户端的信息交互采用的JSON来传输,由于在服务器端用了Struts 2,所以我就用装了一个JSON插件。

这样,很轻易的就把服务器端的信息用JSON的形式发送到了手机端。

以下是代码:首先,在服务器端搭建好SSH框架,具体细节就不在陈述。

struts.xml配置如下:1.<packagename="login"extends="json-default">2.<actionname="login"class="com.jclick.test.LoginAction"method="login">3.<resulttype="json"><paramname="includeProperties">result</param></result>4.</action>5.</package>6.7. <packagename="login"extends="json-default">8. <actionname="login"class="com.jclick.test.LoginAction"method="login">9. <resulttype="json"><paramname="includeProperties">result</param></result>10. </action>11. </package>手机端的代码如下:首先,手机端有一个缓存类,主要用于缓存一些手机端需要访问的数据,这样的好处是可以达达节省手机和服务器的交互,用单例实现的:1.packagecom.jclick.cache;2.er;4.5.publicclassCache{6.7.privateUserUser;8.9.privateCache(){10.11.}12./**构造单例*/13.Private static class CacheHolder{14.Private static final CacheINSTANCE=newCache();15.}16.Public Cache getInstance(){17.returnCacheHolder.INSTANCE;18.}19.publicUsergetUser(){20.returnUser;21.}22.publicvoidsetUser(UserUser){er=User;24.}25.26.}27.28.packagecom.jclick.cache;29.er;31.32.publicclassCache{33.34. privateUserUser;35.36. privateCache(){37.38. }39./**构造单例*/40. privatestaticclassCacheHolder{41. privatestaticfinalCacheINSTANCE=newCache();42. }43. publicCachegetInstance(){44. returnCacheHolder.INSTANCE;45. }46. publicUsergetUser(){47. returnUser;48. }49. publicvoidsetUser(UserUser){er=User;51. }52.53.}接着开始书写手机端的协议,用户向服务器发送请求,同时服务器反馈给手机端信息的:1.packagecom.jclick.protocol;2.3.importjava.io.BufferedReader;4.importjava.io.InputStreamReader;5.importjava.util.ArrayList;6.importjava.util.List;7.8.importorg.apache.http.HttpResponse;ValuePair;10.importorg.apache.http.client.HttpClient;11.importorg.apache.http.client.entity.UrlEncodedFormEntity;12.importorg.apache.http.client.methods.HttpPost;13.importorg.apache.http.impl.client.DefaultHttpClient;14.importorg.apache.http.message.BasicNameValuePair;15.importorg.json.JSONException;16.importorg.json.JSONObject;17.18.publicclassBaseProtocol{19.privateStringBuildersb=newStringBuilder();20.21.privateHttpClienthttpClient;22.privateHttpPosthttpRequest;23.privateHttpResponseresponse;24.25.privateList<NameValuePair>nameValuePair=newArrayList<NameValuePair>();26.27.BaseProtocol(){28.httpClient=newDefaultHttpClient();29.}30.31./**32.*向服务器端发送请求33.*34.*@paramurl35.*@throwsException36.*/37.protectedvoidpack(Stringurl)throwsException{38.httpClient=newDefaultHttpClient();39.httpRequest=newHttpPost(url);40.41.httpRequest.setEntity(newUrlEncodedFormEntity(nameValuePair));42.response=httpClient.execute(httpRequest);43.}44.45./**46.*得到返回数据47.*48.*@paramurl49.*@return50.*@throwsException51.*/52.protectedvoidparse()throwsException{53.//TODO状态处理50020054.if(response.getStatusLine().getStatusCode()==200){55.56.BufferedReaderbufferedReader2=newBufferedReader(57.newInputStreamReader(response.getEntity().getContent()));58.for(Strings=bufferedReader2.readLine();s!=null;s=bufferedReader259..readLine()){60.sb.append(s);61.}62.}63.}64.65./**66.*向服务器发送信息67.*68.*@paramkey69.*@paramvalue70.*/71.publicvoidaddNameValuePair(Stringkey,Stringvalue){ValuePair.add(newBasicNameValuePair(key,value));73.}74.75./**76.*返回JSONObject对象数据模型77.*78.*@return79.*@throwsJSONException80.*/81.publicJSONObjectgetJSON()throwsJSONException{82.returnnewJSONObject(sb.toString());83.}84.85.}86.87.packagecom.jclick.protocol;88.89.importjava.io.BufferedReader;90.importjava.io.InputStreamReader;91.importjava.util.ArrayList;92.importjava.util.List;93.94.importorg.apache.http.HttpResponse;ValuePair;96.importorg.apache.http.client.HttpClient;97.importorg.apache.http.client.entity.UrlEncodedFormEntity;98.importorg.apache.http.client.methods.HttpPost;99.importorg.apache.http.impl.client.DefaultHttpClient;100.importorg.apache.http.message.BasicNameValuePair;101.importorg.json.JSONException;102.importorg.json.JSONObject;103.104.publicclassBaseProtocol{105. privateStringBuildersb=newStringBuilder();106.107. privateHttpClienthttpClient;108. privateHttpPosthttpRequest;109. privateHttpResponseresponse;110.111. privateList<NameValuePair>nameValuePair=newArrayList<NameValuePair>(); 112.113. BaseProtocol(){114. httpClient=newDefaultHttpClient();115. }116.117./**118. *向服务器端发送请求119. *120. *@paramurl121. *@throwsException122. */123. protectedvoidpack(Stringurl)throwsException{124. httpClient=newDefaultHttpClient();125. httpRequest=newHttpPost(url);126.127. httpRequest.setEntity(newUrlEncodedFormEntity(nameValuePair));128. response=httpClient.execute(httpRequest);129. }130.131./**132. *得到返回数据133. *134. *@paramurl135. *@return136. *@throwsException137. */138. protectedvoidparse()throwsException{139.//TODO状态处理500200140.if(response.getStatusLine().getStatusCode()==200){141.142. BufferedReaderbufferedReader2=newBufferedReader(143. newInputStreamReader(response.getEntity().getContent())); 144.for(Strings=bufferedReader2.readLine();s!=null;s=bufferedReader2 145. .readLine()){146. sb.append(s);147. }148. }149. }150.151./**152. *向服务器发送信息153. *154. *@paramkey155. *@paramvalue156. */157. publicvoidaddNameValuePair(Stringkey,Stringvalue){158. nameValuePair.add(newBasicNameValuePair(key,value));159. }160.161./**162. *返回JSONObject对象数据模型163. *164. *@return165. *@throwsJSONException166. */167. publicJSONObjectgetJSON()throwsJSONException{168. returnnewJSONObject(sb.toString());169. }170.171.}接着是登陆协议,在这里我只是模拟登陆使用的一个类,仅供大家参考:1.packagecom.jclick.protocol;2.3.importorg.json.JSONObject;4.er;6.7.publicclassLoginProtocolextendsBaseProtocol{8.9.privatefinalstaticStringURL="http://localhost:8080/test/login";10.11.publicbooleancheckLogin(Userusr){12.try{13.pack(URL);14.parse();15.JSONObjectobj=this.getJSON();16.if(obj.getString("result").equals("failed")){17.returnfalse;18.}else{19.returntrue;20.}21.}catch(Exceptione){22. e.printStackTrace();23.returnfalse;24.}25.}26.27.}28.29.packagecom.jclick.protocol;30.31.importorg.json.JSONObject;32.er;34.35.publicclassLoginProtocolextendsBaseProtocol{36.37. privatefinalstaticStringURL="http://localhost:8080/test/login";38.39. publicbooleancheckLogin(Userusr){40.try{41. pack(URL);42. parse();43. JSONObjectobj=this.getJSON();44.if(obj.getString("result").equals("failed")){45. returnfalse;46. }else{47. returntrue;48. }49. }catch(Exceptione){50. e.printStackTrace();51. returnfalse;52. }53. }54.55.}然后是User实体类,主要用于保存用户信息:1.packagecom.jclick.bean;2.3.publicclassUser{4.privateStringusername;5.privateStringpassword;6.publicStringgetUsername(){7.returnusername;8.}9.publicvoidsetUsername(Stringusername){ername=username;11.}12.publicStringgetPassword(){13.returnpassword;14.}15.publicvoidsetPassword(Stringpassword){16.this.password=password;17.}18.19.}20.21.packagecom.jclick.bean;22.23.publicclassUser{24. privateStringusername;25. privateStringpassword;26. publicStringgetUsername(){27. returnusername;28. }29. publicvoidsetUsername(Stringusername){ername=username;31. }32. publicStringgetPassword(){33. returnpassword;34. }35. publicvoidsetPassword(Stringpassword){36.this.password=password;37. }38.39.}最后就是LoginActivity里边判断登陆的代码了,详细代码不再贴出来了,仅贴一个判断登陆的代码:1.privatevoidcheckedData(){ername=((EditText)findViewById(ername)).getText().toString();3.password=((EditText)findViewById(R.id.password)).getText().toString();4.eruser=newUser();er.setUsername(username);er.setPassword(password);8.LoginProtocollogin=newLoginProtocol();9.booleanresult=login.checkLogin(user);10.11.if(result){SpiderCache.getInstance().setUserSession(user);12.Toast.makeText(getApplicationContext(),"登录成功",1000).show();13.Intentintent=newIntent();14.intent.setClass(LoginActivity.this,WelcomeActivity.class);15.startActivity(intent);16.}else{Toast.makeText(LoginActivity.this,"密码或用户名不匹配,请重新输入!",1000).show();17.}18.}19.20. privatevoidcheckedData(){21. username=((EditText)findViewById(ername)).getText().toString();22. password=((EditText)findViewById(R.id.password)).getText().toString();23.24. Useruser=newUser();25. user.setUsername(username);26. user.setPassword(password);27. LoginProtocollogin=newLoginProtocol();28. booleanresult=login.checkLogin(user);29.30.if(result){ SpiderCache.getInstance().setUserSession(user);31. Toast.makeText(getApplicationContext(),"登录成功",1000).show();32. Intentintent=newIntent();33. intent.setClass(LoginActivity.this,WelcomeActivity.class);34. startActivity(intent);35. }else{ Toast.makeText(LoginActivity.this,"密码或用户名不匹配,请重新输入!",1000).show();36. }37. }以上代码为了跟大家分享一下,感觉手机端和服务器双向开发非常过瘾。

相关文档
最新文档