精华内容
下载资源
问答
  • ipc通信
    2021-07-29 17:26:44

    FreeRTOS IPC通信方式

    更多相关内容
  • C# 进程间通信,IPC通信

    2022-03-25 16:51:21
    NET Remoting、消息队列、WCF(集成了前述方法的功能,但太新,不支持Windows2000及以前的系统),其中Remoting可以支持TCP、HTTP、IPC通道的通信,而IPC通道速度快,且仅能供处于同一个系统中的进程间...2、IPC通信
  • Android IPC通信系列篇

    2021-11-12 20:53:37
    文章目录1、概念2、Messenger3、AIDL 1、概念 IPC(一)跨进程通讯的几种方式、作用 2、Messenger IPC(二)Messenger实现跨进程双向通信 3、AIDL IPC(三)AIDL实现跨进程通信
    展开全文
  • Android跨进程IPC通信的常用例子,AIDL,Messenger,Binder
  • 多核dsp核间通信例程
  • 电子应用程序的简化IPC通信 与,此模块的最大好处是,它使您可以在同一呼叫中发送消息并获得响应。 这通常需要多个IPC订阅。 您可以在主过程和渲染器过程中直接使用此模块。 安装 $ npm install electron-better-...
  • LPC实现IPC通信.rar

    2021-03-09 11:04:23
    LPC相关函数简介、LPC实现IPC通信文档及代码
  • AIDL:Android Interface Definition Language,即Android接口定义语言,用于生成Android不同进程间进行进程通信(IPC)的代码,一般情况下一个进程是无法访问另一个进程的内存的。如果某些情况下仍然需要跨进程访问内存...
  • 借助AIDL实现IPC通信 一、代码实操—与远端进程的Service绑定 上面的代码都是在当前进程内跟Service通信,现在我们来实现一下,不同进程内Service如何绑定。 AIDL:Android Interface Definition Language,即...
  • Socket通常翻译为套接字,它是为了方便让两台机器能互相通信的一套技术,该套技术封装好了繁琐的TCP/IP协议,向外提供出简单的API简化了通信实现的过程,其可以实现不同层面,不同应用,跨进程跨网络的通信。...

    LocalSocket是什么?
    在弄清LocalSocket是什么之前,有必要先了解下Socket是什么。Socket通常翻译为套接字,它是为了方便让两台机器能互相通信的一套技术,该套技术封装好了繁琐的TCP/IP协议,向外提供出简单的API简化了通信实现的过程,其可以实现不同层面,不同应用,跨进程跨网络的通信。依据Socket提供的数据传输特性可分为如下几个大类:

    • Stream socket: 提供双向、有序、可靠、非重复的数据通信。大致可以认为它封装的TCP通信协议。
    • Datagram socket: 提供双向数据通信,数据不一定按顺序到达。大致可以认为它封装的是UDP通信协议。
    • Sequential socket: 提供双向、有序、可靠数据通信,数据包有最大限制,并且必须把这个包完整的接受才能进行读取。
    • Raw socket: 提供相对TCP/UDP而言较下层的通信协议访问,如果使用非TCP/UDP的通信协议可以使用该类型的socket。

    socket通信过程如下图
    在这里插入图片描述Android系统可以通过命令

    adb shell netstat -apn
    

    在这里插入图片描述LocalSocket通信实例
    一般两个不同的应用之间如果要相互通信,首先想到的解决方案都是利用AIDL,这里我们用LocalSocket来实现。通过该例子来实践下LocalSocket
    一、服务端实现
    1、服务端代码如下所示

    public class ServerActivity extends AppCompatActivity {
    
        private LocalServerSocket mServerSocket = null;
        private LocalSocket mSocket = null;
        private TextView mShowMsg = null;
        private InputStream mInputStream = null;
        private static final String SOCKET_NAME = "com.wq.serverdemo.testsocket";
        private static final String TAG = "wq892373445-Socket";
    
        private final Handler mHandler = new Handler() {
            public void handleMessage(android.os.Message msg) {
                String dispMesg = (String) msg.obj;
                mShowMsg.setText(dispMesg);
            };
        };
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_server);
            Button button = (Button) findViewById(R.id.replay_btn);
            mShowMsg = (TextView) findViewById(R.id.display_msg);
            createServerSocket();// 创建LocalServerSocket
            new Thread(new Runnable() {
                @Override
                public void run() {
                    acceptMsg();//必须要在子线程里接收消息
                }
            }).start();
        }
    
        private void createServerSocket() {
            if (mServerSocket == null) {
                try {
                    /**注意这里new出LocalServerSocket的同时,系统层已经同步做了bind和listen。
                     * 我们看看new的过程:
                     * public LocalServerSocket(String name) throws IOException {
                     *       impl = new LocalSocketImpl();
                     *       impl.create(LocalSocket.SOCKET_STREAM);
                     *       localAddress = new LocalSocketAddress(name);
                     *       impl.bind(localAddress);
                     *       impl.listen(LISTEN_BACKLOG);
                     * }
                     */
                    mServerSocket = new LocalServerSocket(SOCKET_NAME);
                } catch (IOException ex) {
                    throw new RuntimeException(
                            "Error binding to local socket " + ex);
                }
            }
        }
    
        private void acceptMsg() {
            try {
                mSocket = mServerSocket.accept();//accept是个阻塞方法,这就是必须要在子线程接收消息的原因。
            } catch (IOException e1) {
                e1.printStackTrace();
            }
            while (true) {
                try {
                    byte[] buffer = new byte[1024];
                    mInputStream = mSocket.getInputStream();
                    int count = mInputStream.read(buffer);
                    String key = new String(Arrays.copyOfRange(buffer, 0, count));
                    Log.e(TAG, "ServerActivity mSocketOutStream==" + key);
                    if ("stop".equals(key)) {
                        closeSocketResource();
                        break;
                    }
                    Message msg = mHandler.obtainMessage();
                    msg.obj = key;
                    msg.sendToTarget();
                } catch (IOException e) {
                    Log.e(TAG, "exception==" + e.fillInStackTrace().getMessage());
                    e.printStackTrace();
                }
            }
        }
    
        private void closeSocketResource() {
            closeSlient(mInputStream);
            closeSlient(mSocket);
            try {
                if (mServerSocket != null) {
                    mServerSocket.close();
                    mServerSocket = null;
                }
            } catch (IOException ex) {
                Log.e(TAG, "Failed closing ServerSocket" + ex.fillInStackTrace());
            }
        }
    
        private void closeSlient(Closeable closeable){
            try {
                if (closeable != null) {
                    closeable.close();
                    closeable = null;
                }
            } catch (IOException ex) {
                Log.e(TAG, "Failed closing : " + closeable);
            }
        }
    }
    

    2、布局文件

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".ServerActivity">
    
       <Button
           android:id="@+id/replay_btn"
           android:text="这是服务端"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"/>
        <TextView
            android:id="@+id/display_msg"
            android:textColor="#f0f0f0"
            android:layout_width="match_parent"
            android:layout_height="60dp"/>
    
    </LinearLayout>
    

    3、验证服务端是否就绪,输入如下命令

    adb shell netstat -apn|grep testsocket
    

    输出结果:
    在这里插入图片描述则表明服务端已经就绪,等待客户端socket接入发送消息了
    二、客户端的实现
    1、客户端代码

    public class ClientActivity extends AppCompatActivity implements View.OnClickListener {
    
        private LocalSocket mSocket;
        private OutputStream mOut;
        private EditText mEditText = null;
        private static final String SOCKET_NAME = "com.wq.serverdemo.testsocket";//这里必须要跟TestLocalSocketServer中定义的一样
        private static final String TAG = "wq892373445-Socket";
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_client);
            connect();
            mEditText = (EditText) findViewById(R.id.input_msg);
            findViewById(R.id.replay_btn).setOnClickListener(this);
            findViewById(R.id.stop_btn).setOnClickListener(this);
        }
    
        private boolean connect() {
            if (mSocket != null) {
                return true;
            }
            try {
                mSocket = new LocalSocket();//创建LocalSocket,模拟客户端
                LocalSocketAddress address = new LocalSocketAddress(SOCKET_NAME,
                        LocalSocketAddress.Namespace.ABSTRACT);
                mSocket.connect(address);//连接TestLocalSocketServer
            } catch (IOException ex) {
                return false;
            }
            return true;
        }
    
        private boolean writeCommand(String cmdString) {
            final byte[] cmd = cmdString.getBytes();
            final int len = cmd.length;
            try {
                mOut = mSocket.getOutputStream();
                mOut.write(cmd, 0, len);
                Log.e(TAG, "ClientActivity write " + new String(cmd));
            } catch (IOException ex) {
                Log.e(TAG, "ClientActivity write error:" + ex.fillInStackTrace());
                return false;
            }
            return true;
        }
    
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.replay_btn:
                    writeCommand(mEditText.getText().toString());
                    break;
                case R.id.stop_btn:
                    writeCommand("stop");
                    break;
                default:
                    break;
            }
    
        }
    }
    

    2、布局文件

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".ClientActivity">
    
        <Button
            android:id="@+id/replay_btn"
            android:text="回复"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
        <EditText
            android:id="@+id/input_msg"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
        <Button
            android:id="@+id/stop_btn"
            android:text="关闭Socket"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
        <TextView
            android:id="@+id/display_msg"
            android:textColor="#f0f0f0"
            android:layout_width="match_parent"
            android:layout_height="60dp"/>
    
    </LinearLayout>
    

    3、验证服务端是否就绪,输入如下命令

    adb shell netstat -apn|grep testsocket
    

    输出结果:
    在这里插入图片描述则表明客户端已经连接上了服务端,可以给服务端发送消息了
    三、最后在客户端发送消息给服务端效果如下所示
    在这里插入图片描述

    展开全文
  • ipc通信 借助外部存储通信(通过ipc通知其它进程去读取) 方案描述 ipc通信 使用 主进程 ==> 渲染进程 发送:webContents.send(channel[, arg1][, arg2][, ...]) channel String arg (可选) 通过 channel 发送...

    electron-ipc通信性能分析

    购物返利 https://www.cpa5.cn/

    electron的主进程和渲染进程间通信方案

    • ipc通信
    • 借助外部存储通信(通过ipc通知其它进程去读取)

    方案描述

    ipc通信

    使用
    主进程 ==> 渲染进程

    发送:webContents.send(channel[, arg1][, arg2][, ...])

    • channel String
    • arg (可选)

    通过 channel 发送异步消息给渲染进程,你也可发送任意的参数.参数应该在 JSON 内部序列化,并且此后没有函数或原形链被包括了.

    渲染进程可以通过使用 ipcRenderer 监听 channel 来处理消.


    接收:ipcMain.on(channel, listener)

    • channel String
    • listener Function

    监听 channel, 当新消息到达,将通过 listener(event, args...) 调用 listener.

    渲染进程 ==> 主进程

    发送: ipcRenderer.send(channel[, arg1][, arg2][, ...])ipcRenderer.sendSync(channel[, arg1][, arg2][, ...])

    • channel String
    • arg (可选)

    通过 channel 向主进程发送异步(同步)消息,也可以发送任意参数.参数会被JSON序列化,之后就不会包含函数或原型链.

    主进程通过使用 ipcMain 模块来监听 channel,从而处理消息,同步消息通过 event.returnValue 来响应.

    注意: 发送同步消息将会阻塞整个渲染进程,除非你知道你在做什么,否则就永远不要用它 .


    接收:ipcRenderer.on(channel, listener)

    • channel String
    • listener Function

    监听 channel, 当有新消息到达,使用 listener(event, args...) 调用 listener .

    优缺点

    优点:
    • 可以同步或异步通信
    • 使用方式简单
    • 传输数据较小的情况下响应速度快
    缺点:
    • 滥用渲染进程同步通信时会导致进程阻塞,所以要在确保不阻塞的情况下使用
    • 数据量大的场景下会导致内存溢出和通信速度变慢

    借助外部存储通信

    该方案还是基于ipc通信的,将数据存放到磁盘再通过ipc通知监听方去取,所以速度取决于IO读取的速度

    优缺点

    优点:
    • 不占用内存
    • 进程关闭后数据还在
    缺点
    • 读取速度慢,取决于IO读写速度

    测试数据

    测试没有覆盖多种设备和平台

    测试以String为传输类型

    数据大小ipc借助外部存储通信
    100KB<0ms7ms
    1MB3ms24ms
    10MB36ms146ms
    50MB152ms883ms
    100MB326ms2018ms

    结论

    数据量较小时建议使用ipc直接通讯,反应速度快。数据量大的时候可以使用外部存储,可以降低内存占用,释放暂时不用的内存,按需读取。

    展开全文
  • Android IPC通信 - AIDL.zip

    2021-12-11 19:21:03
    Android中Service的进程通信方式 - AIDL入门实践
  • 干货分享:DSP多核IPC通信案例开发案例,欢迎大家下载学习!
  • zmq 之 ipc 通信

    千次阅读 2020-01-02 22:22:20
    在写zeromq 的程序的时候,我们需要设定的...如下图所示,我才用的是pub-xsub-xpub-sub 的模式,其中sub1 和 xpub 在相同的文件夹下,其能够通过正常ipc 进行通信,但是,sub2 不与xpub 在同一个文件夹下的情况的时...
  • 采用的是matlab官方给的例程学习,ccs程序是通过matlab中的simulink模型直接导出生成的。记得配合博文使用啊!
  • electron-better-ipc:简化Electron程序之间的IPC通信
  • 网络编程之IPC通信

    千次阅读 2017-06-05 18:17:59
    初识socket网络编程,这篇文章先介绍一下简单的IPC通信IPC通信即为本地通信,是本机进程之间的通信。先说一下本地通信所需要的结构体#include struct sockaddr_un{ int sun_family; //用于指定协议族,和socket()...
  • android IPC通信(下)-AIDL

    万次阅读 2015-12-17 17:30:23
    android IPC通信(上)-sharedUserId&&Messenger  android IPC通信(中)-ContentProvider&&Socket  这篇我们将会着重介绍AIDL的使用方式和原理,要介绍AIDL先要简单介绍一下 Binder,而且 Messenger,...
  • IPC通信的几种方式

    千次阅读 2019-03-03 22:42:39
    为什么要进行进程间的通讯(IPC (Inter-process communication)) 数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间 共享数据:多个进程想要操作共享数据,一个进程对共享...
  • 以消息队列为例 在使用magget函数创建消息队列的时候,...而使用IPC_PRIVATE,得到的消息队列的key值都是0,而且再次调用又会创建一个新的消息队列,因此无法实现通信。只能在创建子进程之前先创建一个消息队列,让...
  • Android IPC 通信实例

    2015-04-30 09:21:52
    http://blog.csdn.net/birdsaction/article/details/39451849
  • 基于GDBus技术的IPC通信编程详解(2)

    千次阅读 2020-01-02 15:31:19
    时隔多年,作为2020年的开篇,终于迎来了“基于GDBus技术的IPC通信编程详解(1)”续集——基于GDBus技术的IPC通信编程详解(2)! 第一篇谈到了基于gdbus的IPC的协议接口文档。根据这段时间来的项目经验总结,我们可以...
  • IPC:inter process communication 1,RTT的通信机制: 消息队列、邮箱、信号量、互斥量、事件。 2.我又按照其传输的内容分为:数据类和非数据类通信。 数据类,实现线程与线程间、线程与中断间的数据传输:消息队列...
  • 2. IPC进程通信:支持本地进程间通信,支持任意类型数据(文件传输除外),模式有push和pull两种。 具体使用方法,请看示例! 给单位做考勤系统,找了一些通信框架,都不理想,索性就自己动手,类库最开始是去年年初...
  • Socket通信 用来实现进程间通信。也被称为套接字 ,是网络通信中的概念,分为流式套接字 和 用户套接字 两种 ,对应网络传输控制层的 TCP 和UDP 协议 。 TCP 协议 是面向连接的协议 。提供稳定的双向通信功能。 连接...
  • 电子安全IPC electronic-safe-ipc是Electron中主进程与渲染器进程之间的安全通信库。 “安全”是指: 即使在渲染器进程中node-integration == false时也可以使用无需JS对象实例共享即可工作它用: JSON打包数据电子...
  • nodejs 使用net模块的ipc通信

    千次阅读 2019-03-07 21:40:48
    server 端代码 const net = require('net'); let path = require('path'); let server = net.createServer(function ... connect.setEncoding('binary'); connect.on('error',function(exception){ conso...
  • Linux — IPC通信之共享内存

    千次阅读 2017-07-02 13:34:06
    共享内存是三个IPC机制中的一个。它允许两个不相关的进程访问同一个逻辑内存。共享内存是在两个正在进行的进程之间传递数据 的一种非常有效的方式。大多数的共享内存的实现,都把由不同进程之间共享的内存安排为同...
  • Messenger android IPC通信

    2016-07-18 13:58:46
    Messenger 线程安全的进程间通信服务
  • 使用unix sock_domain的范例(高效的IPC通信方式)

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 102,622
精华内容 41,048
关键字:

ipc通信