870920 Menu

JUCE类库进程间通信详解

进程间通信可理解为两个独立的应用程序之间进行数据共享或交换(收发),可使用的连接模式有两种:Pipe已命名管道和Socket套接字。Pipe适合于本机进程间的通信,Socket不仅适合于本机进程间通信,也适合网络通信。

JUCE类库实现进程间通信主要依赖两个类:一是InterprocessConnection进程间连接实例,用于发送或接受数据,二是InterProcessConnectionServer进程间连接服务器(也可称为连接主机),用于为每个客户端创建Socket连接实例,并开启和停止Socket端口侦听。这两个类都是抽象基类,且都继承自Thread线程类。

如采用Pipe模式,则仅使用InterProcessConnection连接实例类即可完成进程间通信,如采用Socket连接模式,则除了连接实例类之外,还需使用InterProcessConnectionServer连接主机类。

 InterprocessConnection 连接实例

本类管理进程所产生的消息,负责两个进程间的连接。连接模式可使用Socket套接字,也可使用已命名的Pipe管道。如要连接到一个等待中的Socket或一个已打开的Pipe,则需调用connectToSocket()或connectToPipe()这两个成员函数。如果连接成功,A进程的消息可发送至B进程,此时,A进程所发送的消息由B进程的messageReceived()进行接收和处理。

使用Pipe模式时,如要打开一个管道并等待另一个终端连接至此,则使用createPipe()函数。

本类需两个构造参数(皆有默认值):

  • 1参如果为true, 回调connectionMade(), connectionLost()和messageReceived()将始终使用消息线程。如果为false,则立即调用本连接的自身线程。
  • 2参:连接头所使用的魔数,以检测发送和接收的数据块的有效性。此值可为任意数字,但发送方和接收方必须匹配此值,否则无法识别对方。该参数有默认值:0xf2b49e2c。

派生类必须实现的纯虚函数有三个:
 connectionMade () 生成连接,首次连接时系统自动调用此函数
 connectionLost () 连接丢失时系统自动调用此函数
 messageReceived () 某条消息抵达时,系统自动调用此函数

本类的其他成员函数:
 connectToSocket () 尝试将此对象连接到一个套接字
 connectToPipe () 尝试将此对象连接到一个已命名的管道
 createPipe () 尝试创建一个新管道,供另一个进程连接所用
 disconnect () 断开并关闭当前打开的任何套接字或管道
 isConnected () 若套接字或管道当前已连接(处于活动状态),则返回true
 getSocket () 返回正在使用的套接字。如正使用管道,则返回nullptr
 getPipe () 返回正在使用的管道。如果正使用套接字,则返回nullptr
 getConnectedHostName () 返回此连接另一个终端的机器名称
 sendMessage () 尝试将一条消息发送到此连接的另一个终端

示例代码(网络发表,代码略):

 InterprocessConnectionServer 连接主机
InterprocessConnectionServer用于等待客户端进程套接到本类对象的某个端口(Socket模式),并为每个客户端进程创建InterprocessConnection连接实例。

本类无需构造参数,派生类必须实现的纯虚函数为:
 createConnectionObject () 为每个客户端创建连接实例,返回值为InterprocessConnection指针

本类的其他成员函数:
 beginWaitingForSocket () 启动端口侦听(仅适用于Socket连接模式)
 stop () 停止端口侦听(仅适用于Socket连接模式)

示例代码(略)。