如何在遠端過程中呼叫(RPC)
HTTP請求式做過Socket程式設計的人都知道,當我們設計一個通訊協定時,「訊息標頭/訊息體」的分割方式是很常用的,訊息頭告訴對方這個訊息是乾什麼的,訊息體告訴對方怎麼幹。
基於HTTP協定實現RPC與基於TCP協定實現RPC比較:
基於HTTP協定的系統間的RPC,具有靈活、實現便利(多種開源的web伺服器支援)、開放(國際標準)且天生支援異質平台之間的呼叫等多個優點,都得到了廣泛的使用。與之相對應的是TCP協定的實現版本,它效率更高,但實現起來更加複雜,且由於協定和標準的不同,難以進行跨平台和企業間的便捷通訊。
HTTP協定實現有其劣勢的一面,由於是上層協議,發送包含同等內容的信息,使用HTTP協議傳輸所佔用的字節數肯定要比使用TCP協議傳輸所佔用的字節數更多。因此,在同等網路環境下,透過HTTP協定傳輸相同內容,效率會比TCP協定的資料傳輸低,訊息傳輸所佔用的時間也更長。當然,透過優化程式碼實現和使用gzip資料壓縮,能夠縮小這一差距。透過權衡利弊,結合實際環境中其效能對於使用者體驗的影響來看,基於HTTP協定的RPC還是有很大的優勢。
1.基於TCP協定實作RPC
服務介面:
public interface SayHelloService{ public String sayHello(String helloArg); }
服務實作:
public class SayHelloServiceImpl implements SayHelloService { @Override public String sayHello(String helloArg) { if(helloArg.equals("Hello")) { return "hello"; }else{ return "bye bye"; } } }
服務消費者Consumer關鍵程式碼:
// 接口名称 String interfacename = SayHelloService.class.getName(); // 需要远程执行的方法 Method method = SayHelloService.class.getMethod("sayHello", java.lang.String.class); // 需要传递到远端的参数 Object[] arguments = {"hello"}; Socket socket = new Socket("127.0.0.1", 1234); // 将方法名称和参数传递到远端 ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream()); output.writeUTF(interfacename); // 接口名称 output.writeUTF(method.getName()); // 方法名称 output.writeObject(method.getParameterTypes()); output.writeObject(arguments); // 从远端读取方法的执行结果 ObjectInputStream input = new ObjectInputStream(socket.getInputStream()); Object result = input.readObject();
服務提供者Privider關鍵代碼:
ServiceSocket server = new ServerSocket(1234); while(true){ Socket socket = server.accept(); //读取服务信息 ObjectInputStream input = new ObjectInputStream(socket.getInputStream()); String interfacename = input.readUTF(); //接口名称 String methodName = input.readUTF(); // 方法名称 Class<?>[] parameterTypes = (Class<?>[])input.readObject(); //参数类型 Object[] arguments = (Object[]) input.readObject(); //参数对象 // 执行调用 Class serviceinterfaceclass = Class.forName(interfacename); Object service = service.get(interfacename); Method method = serviceinterfaceclass.getMethod(methodName, parameterTypes); Object result = method.invoke(service, arguments); ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream()); output.writeObject(result); }
2. 基於HTTP協定的RPC
協定請求定義:
public class Request{ /** * 协议编码 */ private byte encode; /** * 命令 */ private String command; /** * 命令长度 */ private int commandLength; }
協定回應的定義:
public class Response { /** * 编码 */ private byte encode; /** * 响应长度 */ private int responseLength; /** * 响应 */ private String response; }
客戶端實作關鍵程式碼:
// 请求 Request request = new Request(); request.setCommand("HELLO"); request.setCommandLength(request.getCommand().length()); request.setEncode(Encode.UTF8.getValue()); Socket client = new Socket("127.0.0.1", 4567); OutputStream output = client.getOutputStream(); // 发送请求 ProtocolUtil.writeRequest(output, request); InputStream input = client.getInputStream(); Response = response = ProtocolUtil.readResponse(input);
服務端實作關鍵程式碼:
ServerSocket server = new ServerSocket(4567); while(true){ Socket client = server.accept(); //读取响应数据 InputStream input = client.getInputStream(); Request request = ProtocolUtil.readRequest(input); OutputStream output = client.getOutputStream(); // 组装响应 Response response = new Response(); response.setEncode(Encode.UTF8.getValue()); if(request.getCommand().equals("HELLO")){ response.setResponse("hello!"); }else { response.setResponse("bye bye"); } resposne.setResponseLength(response.getResponse().length()); ProtocolUtil.writeResponse(output, response); }
ProtocolUtil 程式碼
public class ProtocolUtil { public static Request readRequest(InputStream input) throws IOException { //读取编码 byte[] encodeByte = new byte[1]; input.read(encodeByte); byte encode = encodeByte[0]; //读取命令长度 byte[] commandLengthBytes = new byte[4]; input.read(commandLengthBytes); int commandLength = ByteUtil.bytes2Int(commandLengthBytes); //读取命令 byte[] commandBytes = new byte[commandLength]; input.read(commandBytes); String command = ""; if(Encode.GBK.getValue() == encode){ command = new String(commandBytes, "GBK"); }else{ command = new String(commandBytes, "UTF8"); } // 组装请求返回 Request request = new Request(); request.setCommand(command); request.setEncode(encode); request.setCommandLength(commandLength); return request; } public static void writeResponse(OutputStream output, Response response) throws IOExceptiono{ //将response响应返回给客户端 output.write(response.getEncode()); // output.write(response.getResponseLength()); //直接write一个int类型会截取低8位传输,丢失高8位 output.write(ByteUtil.int2ByteArray(response.getResponseLength())); if(Encode.GBK.getValue() == resposne.getEncode()){ output.write(response.getResponse().getBytes("GBK")); }else{ output.write(response.getResponse().getBytes("UTF8")); } output.flush(); } }
public static int bytes2Int(byte[] bytes){ int num = bytes[3] & 0xFF; num |= ((bytes[2] << 8) & 0xFF00; num |= ((bytes[1] << 16) & 0xFF0000; num |= ((bytes[0] << 24) & oxFF000000; return num; }
相關推薦:
http://windows.php.net/ 和 http://php.net/ 都提供PHP下載,到底什麼差別呢?
以上是如何在遠端過程中呼叫(RPC)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

PHP仍然具有活力,其在現代編程領域中依然佔據重要地位。 1)PHP的簡單易學和強大社區支持使其在Web開發中廣泛應用;2)其靈活性和穩定性使其在處理Web表單、數據庫操作和文件處理等方面表現出色;3)PHP不斷進化和優化,適用於初學者和經驗豐富的開發者。

PHP和Python各有優劣,選擇取決於項目需求和個人偏好。 1.PHP適合快速開發和維護大型Web應用。 2.Python在數據科學和機器學習領域佔據主導地位。

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。
