服務(wù)端還是用JavaScriptSerializer正常寫,PHP這邊也是正常接收,該轉(zhuǎn)義的轉(zhuǎn)義,該解析的解析。如果發(fā)生錯(cuò)誤,或者傳參失敗,先看看傳輸時(shí)的數(shù)據(jù)是否符合JSON規(guī)則。
創(chuàng)新互聯(lián)建站服務(wù)項(xiàng)目包括定襄網(wǎng)站建設(shè)、定襄網(wǎng)站制作、定襄網(wǎng)頁制作以及定襄網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,定襄網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到定襄省份的部分城市,未來相信會繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
什么是RPC框架? 如果用一句話概括RPC就是:遠(yuǎn)程調(diào)用框架(Remote Procedure Call)那什么是遠(yuǎn)程調(diào)用?通常我們調(diào)用一個(gè)php中的方法,比如這樣一個(gè)函數(shù)方法: localAdd(10, 20),localAdd方法的具體實(shí)現(xiàn)要么是用戶自己定義的,要么是php庫函數(shù)中自帶的,也就說在localAdd方法的代碼實(shí)現(xiàn)在本地,它是一個(gè)本地調(diào)用!遠(yuǎn)程調(diào)用意思就是:被調(diào)用方法的具體實(shí)現(xiàn)不在程序運(yùn)行本地,而是在別的某個(gè)遠(yuǎn)程地方。
遠(yuǎn)程調(diào)用原理
比如 A (client) 調(diào)用 B (server) 提供的remoteAdd方法:
首先A與B之間建立一個(gè)TCP連接;
然后A把需要調(diào)用的方法名(這里是remoteAdd)以及方法參數(shù)(10, 20)序列化成字節(jié)流發(fā)送出去;
B接受A發(fā)送過來的字節(jié)流,然后反序列化得到目標(biāo)方法名,方法參數(shù),接著執(zhí)行相應(yīng)的方法調(diào)用(可能是localAdd)并把結(jié)果30返回;
A接受遠(yuǎn)程調(diào)用結(jié)果,輸出30。
RPC框架就是把我剛才說的這幾點(diǎn)些細(xì)節(jié)給封裝起來,給用戶暴露簡單友好的API使用。
遠(yuǎn)程調(diào)用的好處
解耦:當(dāng)server需要對方法內(nèi)實(shí)現(xiàn)修改時(shí),client完全感知不到,不用做任何變更;這種方式在跨部門,跨公司合作的時(shí)候經(jīng)常用到,并且方法的提供者我們通常稱為:服務(wù)的暴露。
RPC與Socket有什么區(qū)別?
通過上面的簡單闡述,好像RPC與Socket 好像啊。都是調(diào)用遠(yuǎn)程的方法,都是client/server模式,我之前也寫了一篇文章: 細(xì)說socket 那他們有啥區(qū)別呢?
RPC(遠(yuǎn)程過程調(diào)用)采用客戶機(jī)/服務(wù)器模式實(shí)現(xiàn)兩個(gè)進(jìn)程之間相互通信。socket是RPC經(jīng)常采用的通信手段之一,RPC是在Socket的基礎(chǔ)上實(shí)現(xiàn)的,它比socket需要更多的網(wǎng)絡(luò)和系統(tǒng)資源。除了Socket,RPC還有其他的通信方法,比如:http、操作系統(tǒng)自帶的管道等技術(shù)來實(shí)現(xiàn)對于遠(yuǎn)程程序的調(diào)用。微軟的Windows系統(tǒng)中,RPC就是采用命名管道進(jìn)行通信。
RPC與REST有什么區(qū)別?
通過了解RPC后,我們知道是RPC是client/server模式的,調(diào)用遠(yuǎn)程的方法,REST也是我們熟悉的一套API調(diào)用協(xié)議方法,它也是基于client/server模式的,調(diào)用遠(yuǎn)程的方法的,那他倆又有啥區(qū)別呢?
REST API 和 RPC 都是在 Server端 把一個(gè)個(gè)函數(shù)封裝成接口暴露出去,以供 Client端 調(diào)用,不過 REST API 是基于HTTP協(xié)議的,REST致力于通過http協(xié)議中的POST/GET/PUT/DELETE等方法和一個(gè)可讀性強(qiáng)的URL來提供一個(gè)http請求。而 RPC 則可以不基于 HTTP協(xié)議?
因此,如果是后端兩種語言互相調(diào)用,用 RPC 可以獲得更好的性能(省去了 HTTP 報(bào)頭等一系列東西),應(yīng)該也更容易配置。如果是前端通過 AJAX 調(diào)用后端,那么用 REST API 的形式比較好(因?yàn)闊o論如何也避不開 HTTP 這道坎)。
php中流行的rpc框架有哪些
既然php是世界上最好的語言,那php中流行的RPC框架有哪些呢?
先列舉下: phprpc,yar, thrift, gRPC, swoole, hprose
因?yàn)闀r(shí)間和精力有限,不可能一個(gè)一個(gè)的去學(xué)習(xí)和使用,我選幾個(gè)世面上用的最多的幾個(gè)用下吧。因?yàn)镽PC原理是一樣的,都是Client/Server模式,只是每個(gè)框架的使用方式不一樣而已。
PHPRPC 是一個(gè)輕型的、安全的、跨網(wǎng)際的、跨語言的、跨平臺的、跨環(huán)境的、跨域的、支持復(fù)雜對象傳輸?shù)?、支持引用參?shù)傳遞的、支持內(nèi)容輸出重定向的、支持分級錯(cuò)誤處理的、支持會話的、面向服務(wù)的高性能遠(yuǎn)程過程調(diào)用協(xié)議。
客戶端:
package ServerPackage;
import java.io.*;
import java.net.*;
public class ClientTwo {
private Socket sk=null;
private BufferedReader buf=null;
private BufferedReader tobuf=null;
private PrintWriter pw=null;
public ClientTwo(){
try {
sk=new Socket(InetAddress.getLocalHost(),4444);
System.out.println("客戶連接成功!");
buf=new BufferedReader(new InputStreamReader(sk.getInputStream()));
tobuf=new BufferedReader(new InputStreamReader(System.in));
pw=new PrintWriter(sk.getOutputStream(),true);
} catch (Exception e) {
e.printStackTrace();
}
}
public void Talk(){
try {
String stg=tobuf.readLine(); //獲取從控制臺輸入的路徑
pw.println(stg);
String content=buf.readLine();
while(content!=null){
System.out.println(content);
content=buf.readLine();
}
pw.close();
tobuf.close();
buf.close();
sk.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new ClientTwo().Talk();
}
}
服務(wù)器端:
package ServerPackage;
import java.io.*;
import java.net.*;
public class ServerTwo {
private ServerSocket ss=null;
private Socket sk=null;
private BufferedReader buf=null;
private BufferedReader tobuf=null;
private PrintWriter pw=null;
public ServerTwo(){
try {
ss=new ServerSocket(4444);
System.out.println("服務(wù)器等待客戶的連接....");
sk=ss.accept();
System.out.println("有客戶已連接");
buf=new BufferedReader(new InputStreamReader(sk.getInputStream()));
pw=new PrintWriter(sk.getOutputStream(),true);
} catch (Exception e) {
e.printStackTrace();
}
}
public void Send(){
try {
String stg=buf.readLine();
File fe=new File(stg);
if(fe.exists()){
System.out.println("開始發(fā)送.......");
tobuf=new BufferedReader(new FileReader(fe));
String str=tobuf.readLine();
while(str!=null){
pw.println(str);
str=tobuf.readLine();
}
System.out.println("發(fā)送完畢......");
tobuf.close();
pw.close();
sk.close();
ss.close();
}else{
pw.println("沒有你想要的內(nèi)容!");
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new ServerTwo().Send();
}
}
你試試吧。。。。。。。