androidjsonrpc
A. Android中网络通信的几种方式
主要有六种方式:
(1)针对TCP/IP的Socket、ServerSocket
(2)针对UDP的DatagramSocket、DatagramPackage。这里需要注意的是,考虑到Android设备通常是手持终端,IP都是随着上网进行分配的。不是固定的。因此开发也是有一点与普通互联网应用有所差异的。
(3)针对直接URL的HttpURLConnection。
(4)Google集成了Apache HTTP客户端,可使用HTTP进行网络编程。
(5)使用WebService。Android可以通过开源包如jackson去支持Xmlrpc和Jsonrpc,另外也可以用Ksoap2去实现Webservice。
(6)直接使用WebView视图组件显示网页。基于WebView 进行开发,Google已经提供了一个基于chrome-lite的Web浏览器,直接就可以进行上网浏览网页。
B. Geth简介
Geth 又名 go-ethereum,是 ethereum 协议的具体落地实现,通过 geth,可以实现 ethereum 的各种功能
Geth 可以被安装在很多操作系统上,包括 Windows、Linux、Mac 的 OSX、Android 或者 iOS 系统。
Geth客户端主要功能:
javaScript Console:通过后台进行命令操作;
Management API:管理相关的API;
JSON-RPC server:JSON-RPC相关调用API
账号管理(创建账号、锁定账号、解除锁定等);
查询账户信息;
查询交易信息;
查询gasPrice;
交易;
挖矿&停止挖矿;
部署智能合约
等其他相关功能。
(欢迎打赏,一分也是爱)
C. 02 项目架构-IPC通信框架
Android App开发中的IPC(进程间通信)无处不在。比如我们使用的 AlarmManager 、 InputMethodService 都是系统为我们提供的服务,处于单独的进程中。如果需要在自己的App进程中使用这些服务就需要进行IPC通信。
除此之外,我们自己的程序中也会存在进程通信的可能(特别是在一些大型APP中)
QQ:未登陆
微信:使用一段时间后:
场景:在Service中开启定位服务,Service处于单独的进程,需要在App主进程或者其他APP中获得定位结果。
服务中提供暴露给其他进程使用的方法并提供一个 ServiceId 注解标记,而服务实现中必须给到相同的 ServiceId 与方法实现,不强制要求 LocationManager 一定需要继承 ILocationManager j接口,但是为了保证方法签名统一建议继承。(不然一个是getLocation,另一个是getLocation2就不好玩了)
在Service进行定位,定位结果在 LocationManager 中记录。在这个Service中使用框架注册 LocationManager 。
不需要返回 Binder 对象,这意味着使用者不需要编写繁琐没任何提示的AIDL文件。
框架内部会提供 com.enjoy.ipc.IPCService$IPCServiceX 多个预留Service,用于与其他进程通信,如果一个App存在多个进程都需要提供各自进程的服务,可以使用不同的Service。所以本质上依然是借助的Service+Binder通信,但框架将细节封装隐藏,使用更加简单。
获得结果对象后就能像调用本地方法一样调用远程方法(RPC调用)。
在使用中简化了:
1、不需要自己定义AIDL接口,使用的JavaBean也不要求实现 Parcelable 接口;
2、在客户端不需要直接使用 bindService 获得 Binder 对象;
服务端需要定义暴露服务的接口(ILocationManager),客户端如果是其他APP,则需要将接口类放到自己的源码中(不需要接口实现)。接口中定义的方法就是服务端提供给其他进程使用的方法。
整个框架包含了服务端与客户端两端接口。
在服务进程中会缓存 ServiceId 与对应的服务实现Class对象: 服务表 ,同时服务实现中的所有方法列表也需要进行记录: 方法表 。由于一个服务中可能存在多个方法,所以其数据结构为 Map<Class,Map<String,Method>> ,外层 Map 的key为服务Class,内层 Map 的key则为方法标记。
当客户端需要调用服务时,将 ServiceId 、MethodName以及执行方法需要的参数传递给服务端,服务端查表利用反射 Method#invoke 即可执行服务中的方法。
其中客户端的请求被封装为 Request 对象,服务端响应则封装为 Response 对象
服务端只需要暴露服务接口给其他进程使用,所以服务端只需要调用框架的注册接口 regiest 对服务实现进行注册。( 注册的是服务实现,而不是服务接口 )
注册时,通过反射获得Class上的 ServiceId 即可记录 服务表 。同时利用反射获得Class中所有的public Method即可记录 方法表 。
由于框架本质还是利用Binder来完成通信,为了与其他进程通信,框架内部提供了多个预留的Service。
通信Service会返回一个AIDL生成的Binder类对象
客户端使用 send 方法向服务端发起请求。
服务端接收到请求后的实现:
客户端需要先与服务端建立连接,因此框架中提供了 connect 方法,内部封装 bindService 实现与服务端通信Service( IPCService )的绑定。
唯一需要注意的是:
当完成绑定后,客户端就可以获得服务端通信Service提供的 IIPCService 对象,客户端调用 IIPCService#send 发起请求。
当我们需要获得 Location 。则应该调用 LocationManager.getDefault().getLocation() 。这句调用会需要执行 LocationManager 的两个方法: getDefault 与 getLocation 。
然而这个对象存在服务端,客户端如何获得?
我们可以利用动态代理,在客户端创建一个 "假的" 服务接口对象(代理)。
当我们执行这个代理对象的方法( getLocation )时,会回调 IPCInvocationHandler#invoke 方法,在这个方法中框架会向服务端发起请求: IIPCService#send
而 getLocation 会返回一个 Location 记录定位信息的对象,这个对象会被服务端json序列化发送过来,因此,客户端只需要在此处获得 Method 的返回类型并反序列化即可。
RPC指的是:从客户端上通过参数传递的方式调用服务器上的一个函数并得到返回的结果,隐藏底层的通讯细节。在使用形式上像调用本地函数一样去调用远程的函数。
比如我们使用Okhttp进行网络请求:
这种方式很显然不是RPC。
而使用Retrofit:
RPC:我们调用远程的XXX方法,就像在调用本地方法一样。
D. android4.4.2用uiautomatorviewer截屏报错
在cmd窗口中,使用命令:
adbroot
然后再试一下
用Android程序去直连MySQL数据库,觉得这样做不好,出于安全等方面考虑。数据库地址,用户名密码,查询SQL什么的都存在程序里,很容易被反编译等方法看到。
建议把表示层和数据层逻辑分开,数据层对应网页的表示层提供接口,同时在为Android手机端提供一个接口,简介访问数据库,这接口可以2端都保持一致,比如XML+RPC或者json等等,Android端也有现成的东西能直接用,既安全又省事。
android 链接mysql数据库实例:
package com.hl;
import java.sql.DriverManager;
import java.sql.ResultSet;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.Statement;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class AndroidMsql extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btn=(Button)findViewById(R.id.btn);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
sqlCon();
}
});
}
private void mSetText(String str){
TextView txt=(TextView)findViewById(R.id.txt);
txt.setText(str);
}
private void sqlCon(){
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (Exception e) {
e.printStackTrace();
}
try {
String url ="jdbc:mysql://192.168.142.128:3306/mysql?user=zzfeihua&password=12345&useUnicode=true&characterEncoding=UTF-8";//链接数据库语句
Connection conn= (Connection) DriverManager.getConnection(url); //链接数据库
Statement stmt=(Statement) conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
String sql="select * from user";//查询user表语句
ResultSet rs=stmt.executeQuery(sql);//执行查询
StringBuilder str=new StringBuilder();
while(rs.next()){
str.append(rs.getString(1)+"\n");
}
mSetText(str.toString());
rs.close();
F. Android 开发。。。如何连接到服务器上的mysql数据库
1、打开Tableau软件。
G. protobuf和json的一些整理
因为之前项目一直用的是google的protobuf(以下称pb)用来做传输的格式 具体说 就是用这个来序列化数据 为的就是传输速度和体积
这张是效率对比图 (从别人那A来的) 可以明显看出 pb的效率极高
可惜越是方便的东西 越是好用的东西 开始总不是那么顺手
pb需要编写 .proto文件 然后用google的编译器进行编译 (可以编译成很多语言 比如 c++和java等)
```
package tutorial;
option java_package = "com.example.tutorial";
option java_outer_classname = "AddressBookProtos";
message Person {
required string name = 1;
required int32 id = 2;
optional string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}
repeated PhoneNumber phones = 4;
}
message AddressBook {
repeated Person people = 1;
}
```
这是pb文件的写法 不详细描述 请翻墙看 https://developers.google.com/protocol-buffers/docs/javatutorial
刚开始走了很多歪路 因为其实网络 pb的资料 大多数都是从googl官网A下来 教你怎么编译的 然后有一些基础的写法 比如 required repeat optional 等 。。就是一些基础的用法 这并不能满足我们的需求
因为你如果要在java里面使用 (我用的最多的是给手机端写接口) ,那么你知道以上的并不能使用 需要知道更多的东西 比如 rpc 和 grpc 我之前一直不明白 看人家说的好高端
其实你只要涉及到写接口 那么你其实和rpc接触过很多很多 (请自行网络rpc)
RPC(Remote Procere Call Protocol)—— 远程过程调用 协议
我粗鄙的理解就是 c/s 当远程的客户端(ios或者 android )调用你部署在服务器上(可以是tomcat跑 或者 jetty 或者 。。。)的接口 那么就是 rpc 至于grpc 。。还是google吧 其实就是用pb来做序列化的 。。 其他还有一些变化
————————
我一直在用pb 然而ios的同事不会去用。。我也不知道该怎么和他说 (只会写pb的接口)所以就准备改成json的。然后碰到一系列蛋疼的问题 比如 乱码 比如 content-type 不是 application/json ,把我弄的欲仙欲死
现在开始说 换成json后出现的问题 首先是乱码 我在spring-mvc.xml里面已经配置了 消息转化器 并且 设置为 utf-8 然而还是 乱码 后来 web.xml里面也设置了字符过滤 还是不行
后来网络n多资料得知 其实是 spring框架内 StringHttpMessageConverter 类中,默认采用的字符集是 ISO-8859-1 。 而我接口返回的都是 string 自然而然乱码 。其实你只要封装一个类来做返回类型 就不会出现这样的问题 这种问题只有在string的时候才会出现
然而知道了问题的我 还是想返回string 因为感觉比较简洁 (其实不然。。。) , 然后看解决方法
网上搜集的文章 http://blog.csdn.net/wangyangbto/article/details/48804155
http://blog.csdn.net/sen19910708/article/details/49933213
大致是两种 一种是重写那个 StringHttpMessageConverter 类 。
还有一种是 修改 spring配置里面的消息配置器 直接修改为 utf-8 (试过好像不行)
这个问题解决后 让ios测试接口 。。和我说协议不对 我一看
。。。 无语了。。然后开始找问题 。后来看到 原来你返回json 使用的是 @responsebody 这个注解 然而这个注解 会自动根据 浏览器 响应时候的 accept的第一个值作为 content-type。 如果你不指定的话
然后就只能在requestmapping上加上 @RequestMapping(value ="/test",proces="application/json;charset=UTF-8")
然后就不会出现这个问题了。。 但是难道每个都要这样写吗 我找遍了网络 好像还是不行
认命? 其实可以写个 Inteceptor 然后在 spring配置里面加载 达到全局效果
————————————
暂时告一段落 其实 content-type的格式 不代表你所使用的技术 ios和我说 你怎么传回来的是 text/html 这都没人用了 如果你用这个 我还要json干嘛 其实这是误区 content-type只是你看的格式 不代表你传输中的序列化的格式 两者并无多大关系 不过他的网络协议框架 只会 json 那干后台的我们就只能改了。。
还有处理时间戳 办法很多 可以在字段上 注解 前提是你用的是 fastjson , jackson也是可以的
关于 pb的 其他东西 https://github.com/jhunters/jprotobuf (这玩意好像是和网络有关系 好像是网络的人写的。。)不需要在写pb文件 可以直接实体类上 直接注解 达到一样的效果
H. Android请问怎样总是返回的是false
thread.start();这行代码执行后,紧接着就会执行下面的return flag;不会等你这个thread 里面的run方法执行完成后才return flag;所以你的flag初始化为false,所以一直是返回false的。你可以加一个log试试,在thread.start();后面打印一个log,然后看看这个log和你的run方法里面的log的打印顺序你就知道问题所在了。
望采纳。
I. 安卓程序
一、ASE(Android Scripting Environment)简介
支持目前主流的脚本语言,包括:Python,Lua,BeanShell,Perl等,后续版本还会支持Ruby,JavaScript。
脚本可以访问多数的Android
API,有了这个大大简化了的接口,我们可以很方便地实现以下功能:操作Intents、启动Activities、拨打电话、发送短信、扫描条形码、获取地理位置和传感器数据、使用Text-To-Speech(TTS)、......
脚本可以在终端中来交互执行,或者作为后台Service启动,也可以通过Locale命令来启动。
二、安装
1、下载ASE:http://code.google.com/p/android-scripting/ 的Downloads页面下载 ase_r20.apk到Android SDK目录的tools目录;
2、安装ASE:首先你得启动模拟器,通过"adb install ase_r2.apk"来安装,安装完成后会出现ASE图标;
3、安装解释器:启动ASE后里面是空白的(只有一个shell),依法点击:MENU -> Interpreters ->MENU
-> Add ,在列表中选择你想装的解释器后,程序自动开始从网站下载并安装,安装完成之后会出现很多ASE项目自带的例子,点击就可以运行。
三、脚本语言
1、对于BeanShell(Java语言的动态版本),可以直接访问Android的Java API。
2、对其他像Python和Lua,API是通过使用JSON RPC调用来访问Android
API。出于简化的目的,ASE提供了AndroidFacade类。只有被AndroidFacade和AndroidProxy封装了的那部分API才能被Python和Lua的交叉编译解释器所使用。值得庆幸的是,AndroidFacade和AndroidProxy类都很容易扩展,因此我们编写脚本可以先查看AndroidFacade和AndroidProxy类,AndroidFacade和AndroidProxy类位于源代码中"com\google\ase"目录下
J. 安卓调用zxing扫码之后返回结果为空
建议你使用Android应用作为客户端,去访问网站里的应用,比如webapp的servlet。有两种方式: 1)使用JSON RPC 调用 servlet的方法; 2)使用HttpClient对象访问网站的URL。