本文轉(zhuǎn)自:[https://blog.csdn.net/u011240877/article/details/72863432]
RPC 是什么
RPC 即 Remote Procedure Call (遠程過程調(diào)用) 是一種計算機通訊協(xié)議,它為我們定義了計算機 C 中的程序如何調(diào)用另外一臺計算機 S 的程序缀旁,讓程序員不需要操心底層網(wǎng)絡(luò)協(xié)議,使得開發(fā)包括網(wǎng)絡(luò)分布式多程序在內(nèi)的應用程序更加容易踊东。
RPC 是典型的 Client/Server 模式,由客戶端對服務器發(fā)出若干請求辱志,服務器收到后根據(jù)客戶端提供的參數(shù)進行操作会宪,然后將執(zhí)行結(jié)果返回給客戶端。
RPC 位于 OSI 模型中的會話層:
在面向?qū)ο缶幊讨兄玖脖唤凶?“遠程方法調(diào)用”。
IDL 是什么
RPC 只是一種協(xié)議把篓,規(guī)定了通信的規(guī)則纫溃。
在實際工作中客戶端與服務端會有各種各樣的平臺,就好像日常開發(fā)一樣韧掩,為了統(tǒng)一處理不同的實現(xiàn)紊浩,需要定義一個共同的接口,于是有了 IDL疗锐。
IDL 即 Interface Description Language (接口定義語言)坊谁。
它通過一種中立的方式來描述接口,使得在不同平臺上運行的對象和用不同語言編寫的程序可以相互通信交流滑臊。比如口芍,一個組件用 C++ 寫成,另一個組件用 Java 寫雇卷,仍然可以通信鬓椭。
IPC 是什么
IPC 即 Inter-Process Communication (進程間通信)颠猴。
Android 基于 Linux,而 Linux 出于安全考慮小染,不同進程間不能之間操作對方的數(shù)據(jù)翘瓮,這叫做“進程隔離”。
“進程隔離”更詳細的介紹(節(jié)選自:http://blog.csdn.net/u010132993/article/details/72582655):
在 Linux 系統(tǒng)中氧映,虛擬內(nèi)存機制為每個進程分配了線性連續(xù)的內(nèi)存空間,操作系統(tǒng)將這種虛擬內(nèi)存空間映射到物理內(nèi)存空間脱货,每個進程有自己的虛擬內(nèi)存空間岛都,進而不能操作其他進程的內(nèi)存空間,只有操作系統(tǒng)才有權(quán)限操作物理內(nèi)存空間振峻。
進程隔離保證了每個進程的內(nèi)存安全臼疫。
但是在大多數(shù)情形下,不同進程間的數(shù)據(jù)通訊是不可避免的扣孟,因此操作系統(tǒng)必須提供跨進程通信機制烫堤。
Android 幾種進程通信方式
跨進程通信要求把方法調(diào)用及其數(shù)據(jù)分解至操作系統(tǒng)可以識別的程度,并將其從本地進程和地址空間傳輸至遠程進程和地址空間凤价,然后在遠程進程中重新組裝并執(zhí)行該調(diào)用鸽斟。
然后,返回值將沿相反方向傳輸回來利诺。
Android 為我們提供了以下幾種進程通信機制(供開發(fā)者使用的進程通信 API)對應的文章鏈接如下:
文件
AIDL (基于 Binder)
Android 進階:進程通信之 AIDL 的使用
Android 進階:進程通信之 AIDL 解析
Binder
Android 進階:進程通信之 Binder 機制淺析
Messenger (基于 Binder)
Android 進階:進程通信之 Messenger 使用與解析
ContentProvider (基于 Binder)
Android 進階:進程通信之 ContentProvider 內(nèi)容提供者
Socket
Android 進階:進程通信之 Socket (順便回顧 TCP UDP)
在上述通信機制的基礎(chǔ)上富蓄,我們只需集中精力定義和實現(xiàn) RPC 編程接口即可。
如何選擇這幾種通信方式
《Android 開發(fā)藝術(shù)探索》中總結(jié)的已經(jīng)比較全面了:
這里再對比總結(jié)一下:
只有允許不同應用的客戶端用 IPC 方式調(diào)用遠程方法慢逾,并且想要在服務中處理多線程時立倍,才有必要使用 AIDL
如果需要調(diào)用遠程方法,但不需要處理并發(fā) IPC侣滩,就應該通過實現(xiàn)一個 Binder 創(chuàng)建接口
如果您想執(zhí)行 IPC口注,但只是傳遞數(shù)據(jù),不涉及方法調(diào)用君珠,也不需要高并發(fā)寝志,就使用 Messenger 來實現(xiàn)接口
如果需要處理一對多的進程間數(shù)據(jù)共享(主要是數(shù)據(jù)的 CRUD),就使用 ContentProvider
如果要實現(xiàn)一對多的并發(fā)實時通信策添,就使用 Socket
————————————————
版權(quán)聲明:本文為CSDN博主「拭心」的原創(chuàng)文章澈段,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明舰攒。
原文鏈接:https://blog.csdn.net/u011240877/article/details/72863432