问题标签 [distributed-objects]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
cocoa - Cocoa 分布式对象、GC 客户端、非 GC 服务器
我有一个设置,其中有两个 Cocoa 进程,与分布式对象 (DO) 通信。客户端正在使用垃圾收集,服务器没有。
似乎客户在我对它们的直接引用之外挂在遥远的对象上。这意味着即使在我没有对这些对象的引用之后,它们也会在 NSDistantObjectTableEntry 拥有的周围徘徊。显然,它们不会在服务器上被释放。
只有当客户端退出时,它才会放开所有远处的对象。手动断开连接可能也可以,但我不想在客户端运行时这样做。
有没有办法告诉 GC'd DO 客户端放弃不再在本地引用的远程对象?
objective-c - Cocoa/Objective-C 和分布式对象的例子?
我正在学习 Cocoa 和 Objective-C(好吧,还有 C)来制作一些我曾经漂浮过的 Mac 应用程序。我需要使用分布式对象,但找不到简单、简洁的示例。有人知道吗?
objective-c - 活动监视器中的 Cocoa 分布式对象、长轮询、launchd 和“无响应”
设想:
我在 mac 应用程序和 launchd 守护程序(用 Foundation 类编写)之间有一个基于分布式对象的 IPC。由于我之前遇到过关于异步消息传递的问题(例如,我有一个 registerClient: 在服务器的根对象上,并且每当发生事件时服务器的根对象通知/调用客户端代理对象中的方法),我进行了长轮询,这意味着客户端“收获”来自守护进程的事件/通知列表。这种“收获”是通过服务器对象方法调用完成的,然后返回一个 NSArray 实例。
它工作得很好,直到几秒钟后,服务器对象的进程(通过 launchd 启动)开始被标记为红色,旁边有“(未响应)”标签(在活动监视器内)。就像我说的,在功能上,它运作良好,但我们只是想摆脱这个“不响应”的标签。
如何防止出现此“未响应”标签?
仅供参考,我之前已经做过基于启动的流程,这是我第一次进行长轮询。此外,我尝试了基于 NSSocketPortNameServer 的连接以及基于 NSSocketPort 的连接。他们没有这个问题。锁定也不是问题,因为使用的锁只是 NSCondition 的,我们记录并调试了程序,似乎唯一的锁定“问题”在收获部分,实际上,在功能上有效。此外,客户端进程是用 PyObjC 编写的,而服务器进程是使用 ObjC 编写的。
提前致谢。
cocoa - 使用分布式对象出售对象并同步访问
我在我的应用程序中使用分布式对象来提供小型身份验证代理程序和主应用程序之间的通信。主应用程序产生 NSTask,它反过来会调用身份验证程序,而身份验证程序又会回调主程序以获取一些用户凭据。我知道这听起来很复杂,但它必须以这种方式工作,因为 ssh 从 SSH_ASKPATH 中的程序获取密码的方式。
在我的主应用程序中,我有一个名为 PasswordDialog 的对象的单个实例,我将其出售如下;
这在应用程序启动时发生一次。
在身份验证代理中,我回调这个对象如下;
问题是这不像我想要的那样工作。如果有多个身份验证代理同时执行,我发现它们都可以访问同一个对象并同时调用同一个方法。例如,如果我在“responseForPID”的开头放置一个日志语句,最后我得到这样的输出;
似乎有三个不同的进程在具有相同地址的对象的同一线程上输入我的方法。显然我在这里缺少对分布式对象和线程的一些基本理解,但这似乎很神奇?
所以最终我得到了我的问题
(a)有人可以解释这里发生了什么(即我如何获得上面的日志语句)
(b) 显然,出于我的目的,我错误地使用了分布式对象。谁能建议我如何正确地做到这一点。
感谢并感谢您阅读到这个问题的结尾!
编辑:只是为了澄清。我的“responseForPID”方法看起来像这样;
objective-c - Cocoa 分布式对象
我让自己头疼,试图弄清楚如何运行这个分布式对象演示。我可以在同一台机器上本地运行它。
这是情况。我有一个服务器应用程序,它在远程机器上生成一个客户端应用程序 [with OpenGLView]。
我可以用 AppleScript 轻松做到这一点。
客户端应用程序似乎可以出售它的 OpenGLView 窗口:
服务器应用程序找到端口和连接,但引发超时异常:
而且我无法为我的生活弄清楚为什么。
我进入客户端 PC 的控制台:“Port OK”“Conn OK”“Port 8081:Vend OK”
我进入服务器 PC 的控制台:“Port OK”“Conn OK”11/18/09 2:05:36 PM DOTest3[15278] [NSPortCoder sendBeforeTime:sendReplyPort:] timed out (10280263936.092180 280263936.092642) 1
即使 TimeOuts 都设置为 60 秒。
帮助!
-斯蒂芬
服务器:MacMini OS X 10.5 客户端:MacPro OS X 10.6 远程登录、管理等全部启用。
编辑:接受 NSResponder 的建议,我已经出售了控制器,但它仍然无法正常工作。
客户/供应商:
客户端控制器:
服务器控制器:
服务器/(抓取 Vended Objects)
叹息......我确定我只是在这里忽略了一些真正可可基础的东西。
-S!
objective-c - 具有多个客户端的 Obj-C 服务器
我是一个相当新手的 obj-c 开发人员,并且对如何建立客户端-服务器关系有疑问。我正在设计(主要是作为一种爱好)与朋友和家人在互联网上玩的棋盘游戏(想想垄断)。我的问题:如何设置适当的客户端-服务器关系以使一台服务器具有多个客户端?
我的想法是让一台服务器包含有关游戏状态的所有信息,并通过 Cocoa 出色的分布式对象框架向各种对象发送适当的消息。但是,我不知道如何让一台服务器接受多个客户端。
但是然后呢?有没有办法告诉运行循环在连接客户端时停止?如果可能的话,我想避免使用多线程,因为这将是一个全新的学习复杂性,而且这个项目已经足够具有挑战性了!
任何帮助将不胜感激,如有必要,我很乐意澄清任何事情。
提前致谢。
objective-c - NSConnection 问题上的同步分布式对象
我有一个应用程序,它从网络中提取数据,解析它们,并在搜索界面中编译结果。由于数据不是相互依赖的,因此多线程应用程序以同时执行多个获取和解析是有意义的。我在为执行此功能而编写的搜索和解析对象上使用 NSInvocationOperation。
在控制器对象中,我有以下方法:
该应用程序依赖于 Core Data,我收集到的这些数据大多是线程不安全的。我为每个搜索/解析操作(和一个控制器)有一个不同的 NSManagedObjectContext,并且只在操作或代理对象之间传递 NSManagedObjectId。
这些操作通过 NSConnection 对象将完成的解析结果传送回它们的控制器。控制器使用 NSMachPort 对象构造 NSConnection,将自己设置为根对象,并将相同的 NSConnection 对象提供给 NSInvocationOperations 的每个目标。然后控制器将 NSInvocationOperation 排入队列以在其自己的 NSOperationQueue 中执行。
在搜索线程对象中,我有以下方法:
我相信我已经遵循了此处给出的通用线程间通信的 Apple 示例。
我不得不说,在大多数情况下,这很好用:来自 NSConnection rootProxy 的通知按预期发布到主线程中的运行循环,并等待拾取,直到控制器对象准备好。然而,在我的一些测试用例中,它会导致 Core Data 停止工作,因为有时消息会在与调用 rootProxy 对象的 NSInvocationOperation 对象相同的线程中到达控制器对象。
我在控制器中放置了一个调试器点,该点位于搜索/解析操作完成时发送的消息上,果然,有时(只是有时)执行线程不是主要线程。有谁知道为什么会发生这种情况?或者,有没有更简单的方法来构建线程间异步通信?或者我对 Core Data 的处理方法是否完全不合时宜?
提前致谢!
iphone - 我应该如何在 iPhone 应用程序和 Objective-C 服务器端应用程序之间实现双向网络?
我正在寻找有关在用Objective-C编写并在Mac上运行的“服务器端”应用程序与在iPhone上运行的客户端应用程序之间实现某种双向通信的最佳方法的建议。
长话短说,我正在调整现有的库以在客户端-服务器环境中使用。该库(在服务器上运行)基本上是一个提供定期结果的搜索引擎,并且还可以在以后为任何这些结果提供更新。因此,在理想的世界中,我将能够通过我假设的网络解决方案实现以下目标:
- 在服务器上启动查询。
- 让服务器在结果到达时将结果“推送”给客户端。
- 让服务器在单个结果到达时将更新“推送”到客户端。
如果我正在编写此客户端以在另一台 Mac 上运行,我可能会考虑使用分布式对象来掩盖服务器实际上是远程运行的事实,但 DO 在 iPhone 上不可用。
如果我正在编写一个更通用的客户端-服务器应用程序,我可能会考虑使用 HTTP 来提供某种 RESTful 接口来搜索,但是这个解决方案不适合异步更新,另外我提出的也不适合REST 的“无状态”原则:我必须对我的协议进行建模,因此我“创建”了一个搜索资源,随后我可以查询它的状态,并且我必须轮询它的更新。
有人提出的一个建议是使用BLIP之类的东西来为我提供客户端和服务器之间的双向管道,并为知道如何从服务器获取数据的服务器端资源实现我自己的“代理”类型对象。服务器并且另外是可寻址的,以便服务器可以向它们推送更新。虽然 BLIP 提供了双向通信所需的低级消息传递框架,但它仍然给我留下了一些问题:
- 我将如何管理服务器上对象的生命周期?我可以有一个“创建”搜索对象的消息类型,但该对象应该何时被销毁?
- 这在 iPhone 上的表现如何:如果我与服务器保持持久连接,这是否会过快耗尽电池?这个问题在 HTTP 世界中也很相关:大多数异步更新都是使用 COMET 类型的 hack 完成的,这又需要持久连接。
所以现在我仍然完全不确定最好的方法是什么:我已经做了很多搜索和阅读,但还没有找到任何解决方案。我在这里问,因为我确信你们中的许多人已经解决了这个问题。
你是如何在 iPhone 和 Objective-C 服务器端应用程序之间实现实时双向网络的?
objective-c - Objective-C 分布式对象的内存管理:我的临时实例永远存在!
我正在使用 Objective-C分布式对象,并且在理解内存管理在系统下的工作方式时遇到了一些问题。下面给出的示例说明了我的问题:
协议.h
服务器.m
客户端.m
问题是当客户端中的代理对应对象超出范围时,根代理创建的任何远程对象都不会被释放。根据文档:
当对象的远程代理被解除分配时,会向接收者发送一条消息,通知它本地对象不再通过连接共享。
因此,我希望当每个DOTarget
都超出范围时(每次在循环周围),它的远程对应物将被解除分配,因为在连接的远程端没有其他对它的引用。
实际上这不会发生:临时对象仅在客户端应用程序退出时释放,或者更准确地说,在连接无效时释放。我可以通过显式地使我每次在循环中使用的 NSConnection 对象无效并创建一个新对象来强制释放远程端的临时对象,但不知何故这感觉不对。
这是 DO 的正确行为吗?所有临时对象都应该与创建它们的连接一样长吗?因此,连接是否应被视为临时对象,应在针对服务器的每一系列请求中打开和关闭?
任何见解将不胜感激。
architecture - 分布式哈希表 (DHT) 可以用于动态 Web 应用程序吗?另一个P2P设计?
分布式哈希表能否用于具有发布/订阅类型应用程序的双向 Web 应用程序?
我正在研究构建一个论坛类型的应用程序,但具有 DHT 架构和 P2P(尽管中央查找服务器可以提高性能)。想想客户端的 Gnutella/Kazaa 类型的应用程序,但不是访问中央服务器,而是将消息发布到分布在 Internet 上的其他客户端上的主题。是的,我知道这看起来有点奇怪,但我有我的理由...... :) 最终的一致性(比如在 5 分钟内)是可以的。
我一直在网上梳理 DHT 的东西,大多数似乎都是理论上的,我不确定 DHT 是否真的实用。它还需要更新一个主题或至少标记一个“脏位”。
网站上的大师有什么想法吗?另外,关于最成熟的 DHT 框架有什么建议可以尝试吗?
干杯,亚历克斯