當前位置:首頁 » 安卓系統 » androidjsonrpc

androidjsonrpc

發布時間: 2023-01-06 00:48:29

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

然後再試一下

E. android怎麼連接mysql資料庫

用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。

熱點內容
逆戰腳本掛機 發布:2025-05-16 22:30:01 瀏覽:935
java隨機產生數 發布:2025-05-16 22:25:52 瀏覽:255
java任務管理 發布:2025-05-16 22:17:02 瀏覽:571
安卓如何修改cpu 發布:2025-05-16 21:58:20 瀏覽:364
pythonainb 發布:2025-05-16 21:45:56 瀏覽:855
淘汰伺服器可以做家用電腦嗎 發布:2025-05-16 21:41:31 瀏覽:842
遊程編碼c語言 發布:2025-05-16 21:26:51 瀏覽:587
帝來哪個配置值得購買 發布:2025-05-16 21:12:29 瀏覽:463
什麼是nodejs前端伺服器 發布:2025-05-16 21:12:17 瀏覽:405
編譯選項立即綁定未定義符號 發布:2025-05-16 20:55:13 瀏覽:907