RPC(Remote procedure call)译文

远程过程调用RPC是一种允许计算机程序向远程地址空间申请服务的技术,无需程序员关注实现细节。文章详细介绍了RPC的历史、工作原理、标准接触机制以及其在不同场景下的应用。

在计算机科学中,远程过程调用RPC是一种进程间的通讯,允许一个计算机程序向另外一个地址空间(通常是共享网络中的另一台计算机)申请服务(使得特定程序在另一台计算机上执行),而无需程序员明确写明该远程调用的实现细节。也就是说,本质上程序员只要写出同样的代码,不管该特定程序是在本地还是在远程。当申请服务的计算机程序使用了面向对象的编程原则时,RPC被称为远程调用或远程方法调用。

许多不同的技术(通常不兼容)可以用来实现RPC。

历史起源

在早期的ARPANET文档中,将网络操作当作远程调用的想法,至少可以追朔到20世纪80年代。

该词的提出归功于Bruce Jay Nelson。RPC第一次商务上的应用之一是Xerox在1981年以“Courier"的名字提出的。RPC在Unix下的第一次普遍实现是Sun's RPC(现在称为ONC RPC),被用作网络文件系统NFS的基础。

消息传递

一个RPC是由客户端发起的,该客户端发送请求消息到一个已知的远程服务器,利用提供的参数来执行指定的应用程序。远程服务器给客户端发送回一个响应,同时应用程序继续其进程。在不同的实现中,有许多变化和微小的差异,从而导致各种不同的(不兼容的)RPC协议。当服务器正在处理调用,客户端被阻塞(客户端在服务器恢复执行前直到完成处理调用一直在等待),除非客户端发送给服务器的是一个异步请求,比如XHTTP调用。

远程调用和本地调用之间一个重要的差别在于远程调用会因为不可预期的网络问题而失败。而且,调用者通常必须在不知道远程程序是否真正被调用前处理这些错误。幂等程序(经多次调用而不产生副作用)很容易处理,但编写代码来调用远程程序常常受限于细心编写的底层子系统,这个过程仍然会碰到足够多的困难。

一次RPC过程的事件顺序

1. 客户端调用客户端根stub。该调用是本地调用,将参数用正常的方式压到堆中;

2. 客户端stub将参数打包成消息,执行系统调用来发送消息。消息的打包称为编组marshalling;

3. 客户端的本地操作系统从本地向服务器发送消息;

4. 服务器端的本地操作系统将收到的包传送到服务器的根stub;

5. 最后,服务器的根调用服务器端程序。服务器端的响应遵循同样的步骤,只不过方向相反。

标准接触机制

为了让不同的客户端访问服务器,建立了许多标准化的RPC系统。其中大多数使用接口描述语言(IDL,Interface Description Laguage)以让不同的平台调用RPC。IDL文件可用来产生代码以连接客户端和服务器。其中最常用的工具就是RPCGEN。


备注:

1. 由于使用 RPC 的程序不必了解支持通信的网络协议的情况,因此 RPC 提高了程序的互操作性。

2. 在 RPC 中,发出请求的程序是客户程序,而提供服务的程序是服务器

3. RPC 的主要目的是为组件提供一种相互通信的方式,使这些组件之间能够相互发出请求并传递这些请求的结果。


原文地址:http://en.wikipedia.org/wiki/Remote_procedure_call



在Godot引擎中,RPCRemote Procedure Call)是一种用于在不同节点之间进行远程调用的机制。C#作为Godot引擎支持的编程语言之一,可以方便地使用RPC功能。以下是一些基本步骤和示例,帮助你在C#中调用Godot的RPC。 ### 基本步骤 1. **标记RPC方法**:在C#脚本中,使用`[Remote]`属性标记你想要远程调用的方法。 2. **连接到服务器**:确保你的节点已经连接到Godot的服务器。 3. **调用RPC方法**:使用`Rpc()`方法在客户端或服务器上调用远程方法。 ### 示例代码 ```csharp using Godot; using System; public class NetworkPlayer : Node { // 标记为RPC方法 [Remote] public void UpdatePosition(Vector3 newPosition) { Position = newPosition; } public override void _Ready() { // 连接到服务器 if (IsNetworkServer()) { GD.Print("Server is ready"); } else { GD.Print("Client is ready"); // 调用服务器RPC方法 RpcId(1, "UpdatePosition", new Vector3(10, 0, 10)); } } public override void _Process(float delta) { // 示例:每秒钟更新一次位置 if (Input.IsActionJustPressed("ui_accept")) { Rpc("UpdatePosition", new Vector3(20, 0, 20)); } } } ``` ### 解释 1. **标记RPC方法**:`[Remote]`属性标记了`UpdatePosition`方法,使其可以被远程调用。 2. **连接到服务器**:在`_Ready()`方法中,检查节点是否连接到服务器。如果是客户端,则调用服务器的`UpdatePosition`方法。 3. **调用RPC方法**:在`_Process()`方法中,使用`Rpc()`方法调用`UpdatePosition`方法,更新节点的位置。 ### 注意事项 - 确保网络连接已正确配置,并且节点已连接到服务器。 - 使用`RpcId()`方法可以指定调用的目标节点ID。 - RPC方法需要在所有连接的节点上定义。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值