-
更多相关内容
-
C# 进程间通信,IPC通信
2022-03-25 16:51:21NET 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-Android跨进程IPC通信的常用例子AIDLMessengerBinder
2019-08-13 05:39:31Android跨进程IPC通信的常用例子,AIDL,Messenger,Binder -
IPC_example_on_6678_6678_6678ipc_6678多核_customsonf_ipc通信
2021-09-11 14:55:21多核dsp核间通信例程 -
electronic-better-ipc:Electron应用程序的简化IPC通信
2021-02-04 04:25:48电子应用程序的简化IPC通信 与,此模块的最大好处是,它使您可以在同一呼叫中发送消息并获得响应。 这通常需要多个IPC订阅。 您可以在主过程和渲染器过程中直接使用此模块。 安装 $ npm install electron-better-... -
LPC实现IPC通信.rar
2021-03-09 11:04:23LPC相关函数简介、LPC实现IPC通信文档及代码 -
详解Android跨进程IPC通信AIDL机制原理
2021-01-06 02:12:45AIDL:Android Interface Definition Language,即Android接口定义语言,用于生成Android不同进程间进行进程通信(IPC)的代码,一般情况下一个进程是无法访问另一个进程的内存的。如果某些情况下仍然需要跨进程访问内存... -
Android使用Service实现IPC通信的2种方式
2021-01-21 20:07:15借助AIDL实现IPC通信 一、代码实操—与远端进程的Service绑定 上面的代码都是在当前进程内跟Service通信,现在我们来实现一下,不同进程内Service如何绑定。 AIDL:Android Interface Definition Language,即... -
IPC通信方式之Socket使用
2020-04-11 19:10:00Socket通常翻译为套接字,它是为了方便让两台机器能互相通信的一套技术,该套技术封装好了繁琐的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
输出结果:
则表明客户端已经连接上了服务端,可以给服务端发送消息了
三、最后在客户端发送消息给服务端效果如下所示
-
electron-ipc通信性能分析
2021-06-25 17:41:57ipc通信 借助外部存储通信(通过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
Stringarg
(可选)
通过
channel
发送异步消息给渲染进程,你也可发送任意的参数.参数应该在 JSON 内部序列化,并且此后没有函数或原形链被包括了.渲染进程可以通过使用
ipcRenderer
监听channel
来处理消.
接收:
ipcMain.on(channel, listener)
channel
Stringlistener
Function
监听
channel
, 当新消息到达,将通过listener(event, args...)
调用listener
.渲染进程 ==> 主进程
发送:
ipcRenderer.send(channel[, arg1][, arg2][, ...])
或ipcRenderer.sendSync(channel[, arg1][, arg2][, ...])
channel
Stringarg
(可选)
通过
channel
向主进程发送异步(同步)消息,也可以发送任意参数.参数会被JSON序列化,之后就不会包含函数或原型链.主进程通过使用
ipcMain
模块来监听channel
,从而处理消息,同步消息通过event.returnValue
来响应.注意: 发送同步消息将会阻塞整个渲染进程,除非你知道你在做什么,否则就永远不要用它 .
接收:
ipcRenderer.on(channel, listener)
channel
Stringlistener
Function
监听
channel
, 当有新消息到达,使用listener(event, args...)
调用listener
.优缺点
优点:
- 可以同步或异步通信
- 使用方式简单
- 传输数据较小的情况下响应速度快
缺点:
- 滥用渲染进程同步通信时会导致进程阻塞,所以要在确保不阻塞的情况下使用
- 数据量大的场景下会导致内存溢出和通信速度变慢
借助外部存储通信
该方案还是基于ipc通信的,将数据存放到磁盘再通过ipc通知监听方去取,所以速度取决于IO读取的速度
优缺点
优点:
- 不占用内存
- 进程关闭后数据还在
缺点
- 读取速度慢,取决于IO读写速度
测试数据
测试没有覆盖多种设备和平台
测试以String为传输类型
数据大小 ipc 借助外部存储通信 100KB <0ms 7ms 1MB 3ms 24ms 10MB 36ms 146ms 50MB 152ms 883ms 100MB 326ms 2018ms 结论
数据量较小时建议使用ipc直接通讯,反应速度快。数据量大的时候可以使用外部存储,可以降低内存占用,释放暂时不用的内存,按需读取。
-
Android IPC通信 - AIDL.zip
2021-12-11 19:21:03Android中Service的进程通信方式 - AIDL入门实践 -
DSP多核IPC通信案例开发案例|基于TI KeyStone TMS320C665557评估板.pdf
2021-03-18 17:38:12干货分享:DSP多核IPC通信案例开发案例,欢迎大家下载学习! -
zmq 之 ipc 通信
2020-01-02 22:22:20在写zeromq 的程序的时候,我们需要设定的...如下图所示,我才用的是pub-xsub-xpub-sub 的模式,其中sub1 和 xpub 在相同的文件夹下,其能够通过正常ipc 进行通信,但是,sub2 不与xpub 在同一个文件夹下的情况的时... -
Matlab生成dsp程序——IPC通信.zip
2020-07-14 17:30:38采用的是matlab官方给的例程学习,ccs程序是通过matlab中的simulink模型直接导出生成的。记得配合博文使用啊! -
electronbetteripc简化Electron程序之间的IPC通信
2019-08-10 14:50:33electron-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:23android IPC通信(上)-sharedUserId&&Messenger android IPC通信(中)-ContentProvider&&Socket 这篇我们将会着重介绍AIDL的使用方式和原理,要介绍AIDL先要简单介绍一下 Binder,而且 Messenger,... -
IPC通信的几种方式
2019-03-03 22:42:39为什么要进行进程间的通讯(IPC (Inter-process communication)) 数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间 共享数据:多个进程想要操作共享数据,一个进程对共享... -
IPC通信中IPC_PRIVATE 和 key的区别
2020-05-02 11:09:46以消息队列为例 在使用magget函数创建消息队列的时候,...而使用IPC_PRIVATE,得到的消息队列的key值都是0,而且再次调用又会创建一个新的消息队列,因此无法实现通信。只能在创建子进程之前先创建一个消息队列,让... -
Android IPC 通信实例
2015-04-30 09:21:52http://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的协议接口文档。根据这段时间来的项目经验总结,我们可以... -
RTT的IPC机制篇——IPC通信总结
2019-10-16 21:48:38IPC:inter process communication 1,RTT的通信机制: 消息队列、邮箱、信号量、互斥量、事件。 2.我又按照其传输的内容分为:数据类和非数据类通信。 数据类,实现线程与线程间、线程与中断间的数据传输:消息队列... -
TCP+IPC通信类库(源码+示例)
2017-03-17 14:21:172. IPC进程通信:支持本地进程间通信,支持任意类型数据(文件传输除外),模式有push和pull两种。 具体使用方法,请看示例! 给单位做考勤系统,找了一些通信框架,都不理想,索性就自己动手,类库最开始是去年年初... -
Ipc通信机制---socket的 概念
2018-11-25 11:05:21Socket通信 用来实现进程间通信。也被称为套接字 ,是网络通信中的概念,分为流式套接字 和 用户套接字 两种 ,对应网络传输控制层的 TCP 和UDP 协议 。 TCP 协议 是面向连接的协议 。提供稳定的双向通信功能。 连接... -
electron-safe-ipc:在Electron中主进程和渲染器进程之间的安全通信
2021-04-27 12:48:02电子安全IPC electronic-safe-ipc是Electron中主进程与渲染器进程之间的安全通信库。 “安全”是指: 即使在渲染器进程中node-integration == false时也可以使用无需JS对象实例共享即可工作它用: JSON打包数据电子... -
nodejs 使用net模块的ipc通信
2019-03-07 21:40:48server 端代码 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:46Messenger 线程安全的进程间通信服务 -
使用unix sock_domain的范例(高效的IPC通信方式)
2017-05-04 17:20:20使用unix sock_domain的范例(高效的IPC通信方式)