Objective c 使用NSStringFromSelector通过网络发送方法

Objective c 使用NSStringFromSelector通过网络发送方法,objective-c,networking,Objective C,Networking,我目前正在使用objective-c和两台计算机(mac1和mac2)进行一些模拟,采用客户端方法 我有一个类客户机,每台计算机上都有一个“客户机”实例(client1,client2)。我希望两个客户端都是同步的:除了内存位置之外,它们都是相等的 当用户在mac1上按下一个键时,我希望client1和client2都能从类客户机接收到一个给定的方法(以便它们是同步的,也就是说,它们除了在每个mac上的内存位置之外是相同的) 对于这种方法,我目前的想法是采用两种方法: - (void) send

我目前正在使用objective-c和两台计算机(mac1和mac2)进行一些模拟,采用客户端方法

我有一个类客户机,每台计算机上都有一个“客户机”实例(client1,client2)。我希望两个客户端都是同步的:除了内存位置之外,它们都是相等的

当用户在mac1上按下一个键时,我希望client1和client2都能从类客户机接收到一个给定的方法(以便它们是同步的,也就是说,它们除了在每个mac上的内存位置之外是相同的)

对于这种方法,我目前的想法是采用两种方法:

- (void) sendSelector:(Client*)toClient,...;
- (void) receiveSelector:(Client*)fromClient,...;
sendSelector:使用NSStringFromSelector()将方法转换为NSString,并通过网络发送(现在不用担心通过网络发送字符串)

另一方面,receiveSelector:使用NSSelectorFromString()将NSString转换回选择器

我的第一个问题是:这种方法在多大程度上是与objective-c联网的“标准”

我的第二个问题:

方法的参数呢?有没有办法“打包”给定的类实例并通过网络发送?我理解打包时指针的问题,但是程序上的每个实例都是唯一的标识,因此这应该没有问题,因为两个客户端都知道如何从其标识检索对象


感谢您的帮助

这些天来,似乎最标准的方法是将所有内容打包到JSON上。

让我先回答您的第二个问题:

方法的参数呢?有没有办法“打包”一个给定的文件 类实例并通过网络发送

许多Cocoa类实现/采用NSCoding@协议。这意味着它们支持一些默认实现,用于序列化为字节流,然后通过网络发送。您最好使用NSCoding方法,除非它由于某种原因根本不适合您的需要。(即,使用完成工作的最高抽象级别)

现在来看你第一个问题的哲学方面;我将把您的问题重新表述为“使用序列化方法调用作为网络上两个客户机之间的通信手段是一种好方法吗?”

首先,您应该知道Objective-C有一个不再经常使用但相当完整的实现,用于处理具有高抽象级别的机器之间的远程调用。它被称为分布式对象。苹果似乎在某种程度上把它隐藏起来(有充分的理由——继续阅读),但我找到了一份旧的指南缓存副本。你可能会发现它很有用。顺便说一句,分布式对象的所有基础仍然在Objective-C运行时/框架中提供,因此如果您想使用它,即使只是原型,您可能也可以

我无法推测这些天在developer.apple.com上找不到该文档的确切原因,但我认为可以公平地说,一般来说,您不希望在生产中或通过不安全的网络渠道(例如:通过互联网)使用这种远程调用方法这是一个巨大的潜在攻击向量。试想一下:如果我可以修改或欺骗您的网络消息,我可以诱导您的客户端应用程序使用任意参数调用任意选择器。不难看出这怎么会出错

在较高的层次上,我建议为您的应用程序提供某种协议,使用某种任意的wire格式(另一个人提到JSON——这几天它得到了很多支持——但是使用NSCoding可能会最快地引导您),当您的客户机收到这样的消息时,它应该将消息作为数据读取,并决定要采取什么操作,而不必在运行时实际从消息本身派生出实际上是什么代码

从“把事情做完”的角度来看,我喜欢分享我不久前学到的一句格言:“让它工作;让它工作正确;让它工作迅速。按照这个顺序。”

对于原型设计,也许您不关心安全性。也许当你只是想“让它工作”的时候,你使用了分布式对象,或者你推出了自己的远程调用协议,就像你一直想做的那样。请记住:在将其发布到野外之前,您确实需要“使其正常工作”,否则,您为创建原型而做出的决策可能会让您付出高昂的代价。这里最好的方法是创建一个类或一组类,将网络协议和有线格式从代码的其余部分抽象出来,这样以后就可以在不接触所有代码的情况下交换网络实现

还有一个建议:我在你最初的问题中读到了一个愿望,即“在多个客户机之间保持对象(或者对象图)同步”。这是一个复杂的主题,但你可能希望采用“命令模式”(请参阅四人帮书籍,或任何其他野外处理方法)采用这种方法也可能会固有地为您的网络协议带来结构。换句话说,一旦您将所有的模型变异操作分解为“命令”,那么您的协议可能就简单到使用NSCoding序列化这些命令,然后通过网络将它们传送到另一个客户机,然后在那里再次执行它们

希望这有帮助,或者至少给你一些出发点和需要考虑的事情。