我正在编写一个与RESTful服务接口的Android应用程序.此Web服务基本上是文件系统的前端,并提供元数据以及对文件的CRUD访问.我的应用程序检索元数据,并通过a将其公开给第三方应用程序ContentProvider.
我需要添加第三方应用程序的能力,在与我的应用程序相同的设备上运行,通过向我的应用程序发送请求(而不是直接与服务器)来CRUD实际文件.这意味着他们需要通过我的应用程序发送或接收文件的内容(通常是XML或图像).
我想到了实现这个的两种方法:
这似乎是让第三方应用程序能够从我的文件中读取文件的明显选择ContentProvider.我认为当这些应用程序需要通过我的`ContentProvider'创建或更新文件时,它开始变得棘手.完成后我需要回调才能知道何时将新的/更改的文件发送回服务器.我相信我可以为此目的使用FileObserver.
通过这种方法,我可以通过应用程序和客户端应用程序之间的文件发送Messenger.该文件必须通过一个传递Bundle,所以我不知道什么是最好的格式是发送它们(File,FileDescriptor,字节数组,别的东西?).如果文件变得很大,我不能很好地处理这会导致问题.
Messenger/ 传递CRUD请求和删除框内容ServiceContentProvider来存储请求的状态ContentObserver我认为使用ContentProvider将是理想的解决方案,但似乎API并不完全支持我的用例.我担心尝试沿着这条路走下去可能会导致一个愚蠢的实施.如果我采用Messenger和Service接近,我不确定通过a传输文件的最强大的方法Bundle.
混合方法似乎非常强大,但实现起来最复杂.文件实际上并没有被传递,因此性能应该很好.但是,我担心这会过度设计解决方案.
在同一Android设备上运行的应用程序之间传输文件的最佳方法是什么? 当然,我对我在问题中没有概述的其他选项持开放态度.
我正在开发一个包含大量个人用户信息的应用程序 - 例如Facebook联系人等等......现在,我希望能做的事情之一(并且已经完成,非常有效)使用Android的内置进程间通信协议(AIDL)向"第三方"应用程序开放应用程序的一部分.到现在为止还挺好.
这就是问题所在:因为我们参与处理了大量的个人信息,所以我们必须非常小心谁能够访问它,不能访问它; 具体来说,只有"受信任"的应用程序才能够这样做.因此,执行此操作的自然方法是在我们声明服务的AndroidManifest.xml文件中使用自定义权限.我的问题是这样的:我希望能够实现签名级保护(类似于正常的"签名"权限级别),但有一点点:
我不仅希望使用我们的内部签名签名的应用程序能够访问服务.我希望能够在运行时构建一个"可信签名"列表(或者如果有更好的方法,那么可能还有其他时间?)能够根据可信密钥列表检查传入请求.
这将以与我认为的正常"签名"权限级别相同的方式满足安全性约束 - 只有"可信密钥列表"上的程序才能访问服务,并且密钥很难欺骗(如果可能的话)? ) - 但还有额外的好处,我们不必签署每个使用API和我们内部团队密钥的应用程序.
这在Android中是否可行?如果是这样,有什么特殊要求吗?
谢谢
并感谢您看一下这个问题.
背景
我有几台机器在很短的时间内连续产生多个(最多300)PHP脚本控制台.这些脚本快速运行(不到一秒钟)然后退出.所有这些脚本都需要只读访问大型trie结构,每次运行脚本时加载到内存中都非常昂贵.服务器运行Linux.
我的解决方案
创建一个C守护进程,将trie结构保存在内存中并接收来自PHP客户端的请求.它将收到来自每个PHP客户端的请求,对内存结构执行查找并回答答案,从而避免PHP脚本执行该工作.请求和响应都是短字符串(不超过20个字符)
我的问题
我是C守护进程和进程间通信的新手.经过大量研究,我已将选择范围缩小到Message Queues和Unix域套接字.消息队列似乎已经足够了,因为我认为(我可能错了)他们排队了守护进程的所有请求以连续回答它们.但是,Unix域套接字似乎更容易使用.但是,我有各种各样的问题,我无法找到答案:
数据结构的实际查找非常快,我不需要任何复杂的多线程或类似解决方案,因为我认为以FIFO方式处理请求就足够了.我还需要保持简单的愚蠢,因为这是一项关键任务服务,而且我对这类程序还是比较陌生的.(我知道,但我真的无法解决这个问题,学习经验会很棒)
我真的很感激代码片段,它为我所具有的具体问题提供了一些亮点.指南和指针的链接也将受到欢迎,这些指南将进一步了解这个低级别IPC的阴暗世界.
谢谢你的帮助!
现在比我在提出这个问题时所了解的要多得多,我只是想向任何感兴趣的人指出,Thrift框架和ZeroMQ在抽象硬件,套接字级编程方面做得非常出色.Thrift甚至可以免费为您提供服务器的脚手架!
事实上,不要去构建网络服务器的所有艰苦工作,而是考虑使用已经为您解决问题的良好异步服务器编写应用程序服务器代码.当然,使用异步IO的服务器非常适合不需要密集CPU处理的网络应用程序(或者事件循环块).
python的例子:Twisted,gevent.我更喜欢gevent,而且我不包括龙卷风,因为它专注于HTTP服务器端.
Ruby的例子:EventMachine
当然,Node.js基本上是当今异步服务器的默认选择.
在此页面中,http://androidapps.org.ua/androidintro_ipc.html,活动之间的意图切换被描述为进程间通信.现在我很困惑每个活动是否是android中的单独进程或应用程序内的所有活动都是一个进程.我使用以下方法检查了我的应用程序中所有活动和服务的进程ID:
int id = android.os.Process.myPid();
System.out.println("Process id of Activity1 :"+id);
Run Code Online (Sandbox Code Playgroud)
但它显示相同的进程ID.请回复.
我经常在Emacs的sql-mysql模式中遇到烦恼,我想知道是否有人有解决方案或更好的解决方法.无论何时我尝试将查询从sql-mode缓冲区发送到活动的SQL进程缓冲区,该查询都不能大于4k.如果它大于4k,则会出现某种中断 - 可能是换行符 - 这会导致mysql解释器在下一行引发错误.
sql-mysql由...实现sql.el,并使用该函数sql-send-region将查询区域(或整个缓冲区)发送到选定的SQL进程缓冲区.sql-send-region电话comint-send-region,然后拨打电话process-send-region.process-send-region是调用一个C函数send_process,无论是在src/process.c在Emacs的源.
看起来这可能只是IPC管道上4k缓冲区产生的限制.由于看起来内核黑客攻击是改变这个大小所必需的,所以这不是一个好的答案.
我想我很困惑的是,如果mysql客户端大于4k,那么通过管道发送的SQL没有被mysql客户端正确地重新组装.有任何想法吗?
Emacs版本:2012-03-25关于allspice的GNU Emacs 23.3.1(x86_64-pc-linux-gnu,GTK +版本2.24.10),由Debian修改
mysql -V:mysql Ver 14.14 Distrib 5.5.24,debian-linux-gnu(x86_64)使用readline 6.2
Sql Mysql选项:-A -C -n(注意我已尝试使用和不使用-n(无缓冲)并且都没有修复此问题)
我有一个活动,它需要响应广播事件.由于活动不能同时成为广播接收者,我制作了一个广播接收器.
我的问题是:如何通过广播接收器通知活动?我相信这是一种常见的情况,那么有这样的设计模式吗?
使用POSIX消息队列或Unix域套接字进行本地IPC通信是否更好?
我曾经在机器之间使用Unix套接字(不是域名),我记得制作和断开连接会导致套接字在最终消失之前停留一段时间.此外,如果您想要"可靠"的交换,您必须使用TCP或设计应用程序以返回ACK.我不确定这是否也适用于Unix域套接字.
在我目前的项目中,我们需要本地IPC.我的第一反应是使用POSIX MQueues,因为我之前使用它们进行本地消息传递.但是,一位同事正在建议使用Unix域套接字.
是一个比另一个更好,还是编程熟悉的问题?或者它可能取决于正在创建的应用程序?
从总体上看,我们正在开发的应用程序遵循客户端/服务器模型.客户端向服务器发送消息以"做某事".但是,客户端不会等待"完成"响应 - 尽管他们确实想知道他们的请求是否已被接收.
发送方的基本逻辑是:
connect to server
send request
note if the send worked or not
disconnect from server
Run Code Online (Sandbox Code Playgroud)
一台服务器可能有数百个客户端.
我们正在运行Linux操作系统的SMP系统(4-8个核心)上执行.
提前致谢.
我正在用IPC进行实验,特别是使用Mutex,Semaphore和Spin Lock.我学到的是Mutex用于异步锁定(具有睡眠(根据我在NET上读到的理论))机制,信号量是同步锁定(具有信号和睡眠)机制,并且自旋锁是同步但非睡眠机制.
任何人都可以帮我澄清这些东西吗?另一个疑问是关于Mutex,当我用线程和互斥体编写程序时,一个线程正在运行另一个线程不处于Sleep状态但它不断尝试获取Lock.所以Mutex正在睡觉或不睡觉???
我试图在C++(Windows)中的两个进程之间创建一个简单的通信,如linux中的FIFO.这是我的服务器:
int main()
{
HANDLE pipe = CreateFile(TEXT("\\\\.\\pipe\\Pipe"), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
ConnectNamedPipe(pipe, NULL);
while(TRUE){
string data;
DWORD numRead =1 ;
ReadFile(pipe, &data, 1024, &numRead, NULL);
cout << data << endl;
}
CloseHandle(pipe);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是我的客户:
int main()
{
HANDLE pipe = CreateFile(TEXT("\\\\.\\pipe\\Pipe"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
ConnectNamedPipe(pipe, NULL);
string message = "TEST";
DWORD numWritten;
WriteFile(pipe, message.c_str(), message.length(), &numWritten, NULL);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
代码不起作用,如何将其修复为FIFO?
我想在我的项目中使用ipcMain/ipcRenderer从Angular到Electron并返回.
电子方面很清楚:
const
electron = require('electron'),
ipcMain = electron.ipcMain,
;
ipcMain.on('asynchronous-message', function(event, arg) {
console.debug('ipc.async', arg);
event.sender.send('asynchronous-reply', 'async-pong');
});
ipcMain.on('synchronous-message', function(event, arg) {
console.debug('ipc.sync', arg);
event.returnValue = 'sync-pong';
});
Run Code Online (Sandbox Code Playgroud)
但我不知道如何将Electron模块集成到我的Angular 2应用程序中.我使用SystemJS作为模块加载器,但我是一个新手.
任何帮助赞赏.谢谢.
---马里奥