2 概述
2.1 内置机制
Erlang 运行时系统内置了两种互操作性机制,**分布式 Erlang** 和 **端口**。端口的变体是 **链接驱动程序**。
分布式 Erlang
通过给 Erlang 运行时系统指定一个名称,可以将其设为分布式 Erlang 节点。分布式 Erlang 节点可以连接到其他节点并监控它们,也可以在其他节点上生成进程。不同节点上的进程之间的消息传递和错误处理是透明的。分布式 Erlang 系统中提供了一些有用的 STDLIB 模块,例如 global,它提供全局名称注册。分布机制是使用 TCP/IP 套接字实现的。
**何时使用:** 分布式 Erlang 主要用于 Erlang-Erlang 通信。它也可以用于 Erlang 与 C 之间的通信,如果 C 程序是作为 C 节点实现的,请参见 C 和 Java 库。
**阅读更多内容:** 分布式 Erlang 和一些分布式编程技术在 Erlang 书籍中有所描述。
有关更多信息,请参见 分布式编程。
相关的联机帮助页如下
- erlang ERTS 中的联机帮助页(描述了 BIF)
- global Kernel 中的联机帮助页
- net_adm Kernel 中的联机帮助页
- pg Kernel 中的联机帮助页
- rpc Kernel 中的联机帮助页
- pool STDLIB 中的联机帮助页
- slave STDLIB 中的联机帮助页
端口和链接驱动程序
从 Erlang 的角度来看,端口提供与外部世界的基本通信机制。端口为外部程序提供面向字节的接口。创建端口后,Erlang 可以通过发送和接收字节列表(而不是 Erlang 项)与之通信。这意味着程序员可能需要发明合适的编码和解码方案。
端口机制的实现取决于平台。对于 UNIX,使用管道,并假定外部程序从标准输入读取并写入标准输出。外部程序可以用任何编程语言编写,只要它能够处理端口实现的进程间通信机制即可。
外部程序驻留在与 Erlang 运行时系统不同的操作系统进程中。在某些情况下,这是不可接受的。例如,考虑具有非常严格时间要求的驱动程序。因此,可以根据某些原则用 C 编写程序,并将其动态链接到 Erlang 运行时系统。这称为 **链接驱动程序**。
**何时使用:** 端口可用于 Erlang 程序和另一个程序在同一台机器上运行的所有互操作性情况。编程相当简单。
链接驱动程序涉及用 C 编写某些回调函数。这需要非常熟练的技能,因为代码链接到 Erlang 运行时系统。
有缺陷的链接驱动程序会导致整个 Erlang 运行时系统内存泄漏、挂起或崩溃。
**阅读更多内容:** Erlang 书籍的“杂项”部分描述了端口。附录 E 描述了链接驱动程序。
BIF open_port/2 在 ERTS 中的 erlang 联机帮助页中有所记录。
对于链接驱动程序,程序员需要阅读 Kernel 中的 erl_ddll 联机帮助页。
**示例:** 端口 中的端口示例。
2.2 C 和 Java 库
Erl_Interface
端口另一端的程序通常是 C 程序。为了帮助 C 程序员,开发了 Erl_Interface 库
Erlang 外部项格式是 Erlang 项作为字节序列(即二进制)的表示形式。使用以下 BIF 在这两种表示形式之间进行转换
Binary = term_to_binary(Term) Term = binary_to_term(Binary)
可以将端口设置为使用二进制而不是字节列表。因此,无需发明任何编码/解码方案。Erl_Interface 函数用于解包二进制文件并将其转换为类似于 Erlang 项的结构。这种结构可以用不同的方式进行操作,转换为 Erlang 外部格式,并发送到 Erlang。
**何时使用:** 在 C 代码中,与 Erlang 二进制文件结合使用。
**阅读更多内容:** 请参见 Erlang Interface 用户指南、命令参考和库参考。在 Erlang/OTP R5B 及更早版本中,这些信息是 Kernel 应用程序的一部分。
**示例:** Erl_Interface 中的 Erl_Interface 示例。
C 节点
使用 Erl_Interface 函数建立与分布式 Erlang 节点的连接并与之通信的 C 程序称为 **C 节点** 或 **隐藏节点**。C 节点的主要优点是,从 Erlang 程序员的角度来看,通信非常容易,因为 C 程序的行为就像一个分布式 Erlang 节点。
**何时使用:** C 节点通常可以在设备处理器(而不是控制处理器)上使用,在这些处理器上,由于内存限制或应用程序特性,C 比 Erlang 更适合。
**阅读更多内容:** 请参见 Erl_Interface 文档中的 ei_connect 部分。程序员还需要熟悉 TCP/IP 套接字,请参见 标准协议 中的套接字和 内置机制 中的分布式 Erlang。
**示例:** C 节点 中的 C 节点示例。
Jinterface
在 Erlang/OTP R6B 中,添加了一个类似于 Erl_Interface 的 Java 库,名为 **jinterface**。它为 Java 程序提供了一个与 Erlang 节点通信的工具。
2.3 标准协议
有时,希望 Erlang 程序与使用标准协议的另一个程序进行通信。Erlang/OTP 目前支持 TCP/IP 和 UDP **套接字**:如下
- SNMP
- HTTP
- IIOP (CORBA)
使用后三种协议之一需要深入了解该协议,本教程不涵盖这些内容。请分别参见 SNMP、Inets 和 Orber 应用程序。
套接字
简而言之,面向连接的套接字通信 (TCP/IP) 包括一个在特定主机上以特定端口号启动的启动套接字(“服务器”)。连接套接字(“客户端”)知道启动主机名和端口号,可以连接到它,并在它们之间发送数据。
无连接的套接字通信 (UDP) 包括一个在特定主机上以特定端口号启动的启动套接字,以及一个连接套接字向它发送数据。
有关套接字概念的详细说明,请参阅有关网络编程的适当书籍。建议使用 W. Richard Stevens 编写的 **UNIX 网络编程,第 1 卷:网络 API - 套接字和 XTI**,ISBN:013490012X。
在 Erlang/OTP 中,通过 Kernel 中的 gen_tcp 和 gen_udp 模块访问 TCP/IP 和 UDP 套接字。两者都易于使用,不需要深入了解套接字概念。
**何时使用:** 用于在与 Erlang 程序相同或不同的机器上运行的程序。
**阅读更多内容:** 请参见 Kernel 中的 gen_tcp 和 gen_udp 联机帮助页。
2.4 IC 和 CORBA
IC (Erlang IDL 编译器) 是一个接口生成器,它根据给定的 IDL 接口规范自动生成 Erlang、C 或 Java 中的存根代码。请参见 IC 用户指南和 IC 参考手册。
有关详细信息,请参见 corba 存储库。
2.5 旧应用程序
关于互操作性,有两个旧的应用程序值得关注。这两个应用程序已被 IC 替换,这里只提一下作为参考。
-
IG - 已从 Erlang/OTP R6B 中移除。
IG (接口生成器) 自动生成用于 Erlang 程序和 C 程序之间的端口或套接字通信的代码,前提是提供包含某些关键字的 C 头文件。
-
Jive - 已从 Erlang/OTP R7B 中移除。
Jive 提供了 Erlang 程序和 Java 程序之间的简单接口。