PPAPI与Browser间使用AsyncIPC通信

采用AsyncIpc这个项目(https://github.com/hicdre/AsyncIpc),来完成PPAPI Plugin进程与Browser进程的通信。

foruok原创,如需转载请关注foruok的微信订阅号“程序视界”联系foruok。

AsyncIpc的IPC实现基于管道,是参考Chromium的IPC代码而来,适用于Windows。Chromium在Render和Browser进程间就使用类似的IPC机制,每一个Render都会与Browser建立一个双向的Channel。AsyncIpc采用类似的概念,抽象了Channel用于进程间通信。

基本用法

介绍下怎么集成AsyncIpc以及关键的类库。

引入方式

AsyncIpc可以编译为静态库和动态库。根据需要,也可以直接把源码加入到项目中。

类库

AyncIpc定义了一个名字空间IPC。IPC::EndPoint代表一个接入点,使用时需要创建一个接入点。当有对端进程接入时,EndPoint会发送一些通知,这些通知通过IPC::Listener接口发送,所以,实现Listener接口即可。

EndPoint类的构造函数原型如下:

Endpoint(const std::string& name, Listener* listener, bool start_now);

它需要一个Listener,所以我们需要先实现Listener接口。IPC::Listener定义如下:

class Listener {
 public:
  // Called when a message is received.  Returns true iff the message was
  // handled.
  virtual bool OnMessageReceived(Message* message) = 0;

  // Called when the channel is connected and we have received the internal
  // Hello message from the peer.
  virtual void OnChannelConnected(int32 peer_pid) {}

  // Called when an error is detected that causes the channel to close.
  // This method is not called when a channel is closed normally.
  virtual void OnChannelError() {}

 protected:
  virtual ~Listener() {}
};

我们从Listener派生的类,实现OnMessageReceived、OnChannelConnected、OnChannelError三个方法即可处理IPC消息和状态。

那现在我们只需要一行代码就可以创建一个接入点等待连接了:

m_endPoint = new IPC::Endpoint("ppapi_ipc", this);

注意this指针代表的类实现了IPC::Listener接口,类声明如下:

class IPCImageClient : public IPC::Listener
{
public:
    IPCImageClient();
    virtual bool OnMessageReceived(IPC::Message* msg);

    virtual void OnChannelConnected(int32 peer_pid);

    virtual void OnChannelError();

private:
    void SendRawImage();
    void SendDecodedImage();

protected:
    int m_peerPid;
    IPC::Endpoint *m_endPoint;
};

而发送消息、接收或处理消息,就要用到Message类。发送消息的代码类似下面:

    scoped_ref_ptr<IPC::Message> msg(new IPC::Message(GetCurrentProcessId(), 101, (IPC::Message::PriorityValue)0));
    msg->WriteBytes(data, size);
    m_endPoint->Send(msg.get());

接收消息的代码类似这样:

bool IPCImageClient::OnMessageReceived(IPC::Message* msg)
{
    uint32 type = msg->type();
    switch (type)
    {
    case 1: // data was consumed,write again
        OutputDebugString(_T("SendImage to plugin\r\n"));
        SendDecodedImage();
        break;
    }
    return true;
}

或者这样:

bool IPCSimpleClient::OnMessageReceived(IPC::Message* msg)
{
    const void *data = msg->payload();;
    unsigned int len = msg->payload_size();
    UIImage *imageView = (UIImage*)m_view;
    uint32 type = msg->type();
    switch (type)
    {
    case 100: // decoded image data
        {
            OutputDebugString(_T("received decoded image\r\n"));
            SkBitmap received;
            SkImageInfo info = SkImageInfo::Make(1280, 720,
                kBGRA_8888_SkColorType, kPremul_SkAlphaType,
                kLinear_SkColorProfileType);
            received.installPixels(info, (void*)data, info.minRowBytes());
            imageView->cloneBitmapFrom(received);
            imageView->requestPaint(NULL);
        }
    break;
    ...
    }
}

总结一下,使用AsyncIpc的步骤如下:

  • 实现IPC::Listener接口
  • 创建IPC::EndPoint对象,传递Listener接口给它
  • 当连接建立后,发送消息(可以在OnChannelConnected方法中)
  • 在Listener::OnMessageReceived方法中处理消息


就这样吧。

其他参考文章:

时间: 2024-10-29 15:53:08

PPAPI与Browser间使用AsyncIPC通信的相关文章

实现不同vlan间的相互通信方法一:单臂路由

实现不同vlan间的相互通信方法一:单臂路由   一.试验目的:通过单臂路由实现VLAN间的通信 二.使用工具:GNS3模拟器,SecureCRT,其中PC1和PC2用Route模拟 三.实验拓扑: 四.具体步骤 1.设置PC1的IP:192.168.1.1 /24 网关:192.168.1.254 最后通过show ip inter brief进行验证 2.设置PC2的IP:192.168.2.1 /24 网关:192.168.2.254 最后通过show ip inter brief进行验证

iOS程序间使用scheme通信

在 iOS 里,由于沙盒机制,程序之间都是相互隔离,所以想要从一个程序跳转到另一个程序一般情况是做不到,幸好 iOS 程序可以很方便的注册自己的 URL Scheme,这样就可以通过打开特定 URL 的方式来传递参数给另外一个程序,并启动它. 1.首先在A程序中注册scheme, 注意结构体不要搞乱,我开始就是因为结构体顺序不对,导致一直跳转 不成功. 这样的话就设置成功了scheme了.接下来就是去B程序调用该程序了. 2.新建一个B程序,调用A 新建一个button,添加点击事件 当点击该按

ssh实现服务器间无密钥通信

通过ssh-keygent实现两台服务器间的无密钥通信: 两台服务器均为centos6.6系统: [[email protected] ~]# ssh-keygen -t rsa   #全部按enter键,不需要输入其它内容 Generating public/private rsa key pair. Enter file in which to save the key(/root/.ssh/id_rsa): Enter passphrase (empty for no passphrase

Linux间的进程通信;以及子进程的创建

1 "-----第六天-----------------------------------------------------------------------------" 2 3 1.版本控制:svn/git; 4 5 2.进程的概念: 6 1)程序和进程: 7 每个进程操作系统会为它分配 0-4G 的虚拟内存空间(32位操作系统): 其中0-3G为用户内存空间,进程可以对它进行读写操作: 3G - 4G 为系统内核空间,进程没有读写权限. 8 进程只能读写用户空间,没有权限读

【转】在Java与C程序间进行socket通信的讨论

1. 背景 使用socket在Java程序与C程序间进行进程间通信.本文主要描述了在同C程序进行通信的Client端的Java实现功能. 1.1. 使用的语言 Client端:Java,JVM(JDK1.3) Server端:C,UNIX(Sun Solaris) 1.2. 讨论范围 数据发送:只涉及到Java中int整型系列的讨论,包括byte,short,int. 数据接受:涉及到byte,short,int,long,float,double,char. 1.3.Java与C的数据类型的比

在Prism 框架中,实现主程序与模块间 UI 的通信

背景: 在模块的UI中包含 TreeView 控件,在该树形控件的每一节点前面定义了一个复选框,如图 需求: 在两个不同的应用程序中使用该控件,而它在不同应用程序中的外观则并不一致,按照本例,即一个显示复选框,一个不显示. 问题: 解决该问题的一个难处在于,Prism框架本身的设计原则——此 View 会被添加到主程序的 Shell 的 Region 中,所以在主程序中不能直接来控制该 View 的属性及其逻辑. 思路: 利用 EventAggregator 使得主程序与模块间进行通信,从而间接

linux上 用户间发送消息 通信

联想:scp命令 1.使用write命令,向指定用户发送信息:           用户可以使用write命令给其他在线用户发送消息.格式: $ write zhangsan hello   world      //通信内容 按CTRL+D就将消息发送给zhangsan这个用户.          在Shell提示符号输入write,username指接受发送信息的用户名.如果一个用户多次登录到系统, tty参数指定要发送的终端.使用write发送信息的前提条件是该用户已经登录到系统. 可以使

S7-200PLC间的PPI通信

一. PPI通信协议是一种主从式的通信协议,上位机即PC机为主,PLC为从.通信开始由计算机发起,PLC予以响应. 1).计算机按通信任务,用一定格式,向PLC发送通信命令. 2).PLC收到命令后,进行命令校验,如无误,则向计算机发送数据E5H或F9H,作出初步应答. 3).计算机收到初步应答后,再向PLC发送SD DA SA FCFCS ED确认命令. 二. PPI网络配置使用向导 1.进入配置向导,选择2项网络读写操作 2.选择PLC端口0,系统创建的可执行子程序名为NET_EXE 3.选

【python】网络编程-SocketServer 实现客户端与服务器间非阻塞通信

利用SocketServer模块来实现网络客户端与服务器并发连接非阻塞通信.首先,先了解下SocketServer模块中可供使用的类:BaseServer:包含服务器的核心功能与混合(mix-in)类挂钩:这个类只用于派生,所以不会生成这个类的实例:可以考虑使用TCPServer和UDPServer.TCPServer/UDPServer:基本的网络同步TCP/UDP服务器.UnixStreamServer/ UnixDatagramServer:基本的基于文件同步TCP/UDP服务器.Fork