Cerfing 2.0.4

Cerfing 2.0.4

测试已测试
语言语言 Obj-CObjective C
许可证 BSD
发布时间最新发布2016年10月

Nevyn BengtssonNevyn Bengtsson 维护。



Cerfing 2.0.4

  • 作者:
  • Nevyn Bengtsson

由 Nevyn Joachim Bengtsson [email protected],2011-12-28 发布

我喜欢从 plist/json-safe 字典中构建简单的网络协议,并以尽可能少的边界将它们作为 JSON 在套接字上传输。易于原型设计,易于调试。给 Cerfing 一个 AsyncSocket,它

  • 可以将 JSON 序列化的字典通过套接字发送
  • 具有简单的请求和响应系统
  • 支持任意 NSData 附件
  • 具有自动的 '委托分配' 功能,其中基于传入消息的内容调用正确的 ObjC 方法(非常简单的 RPC)

它还可以

  • 支持比 JSON 更多的序列化格式;
  • 与另一种网络协议交织在一起
  • 使用 '传输' 抽象包装除 AsyncSocket 之外的其它套接字库。

示例

使用 Cerfing 发送请求更新服务器 MOTD 的示例

[_conn requestDict:@{
    @"command": @"setMessage", // the command is 'setMessage'
    @"contents": msg // Send 'msg' as the new message to set.
} response:^(NSDictionary *response) {
    // The server has replied.
    if([response[@"success"] boolValue])
        NSLog(@"Successfully updated message!");
    else
        NSLog(@"Couldn't set message, because %@", [response objectForKey:@"reason"]);
}];

在接收方

-(void)request:(CerfingConnection*)conn setMessage:(NSDictionary*)dict responder:(CerfingResponseCallback)respond;
{
    NSString *newMessage = dict[@"contents"];
    if([newMessage rangeOfString:@"noob"].location != NSNotFound) {
        respond(@{
            @"success": @NO,
            @"reason": @"you should be kind!"
        });
    } else {
        _message = newMessage;
        respond(@{
            @"success": @YES
        });
    }
}

注意在响应中,要调用的方法的选择器(request:setMessage:responder:)是基于传入的字典推导出来的。

正如您所看到的,最终的协议类型非常弱。理论上,这意味着您可能会犯拼写错误,并且不明白为什么您的网络似乎出现了问题;实际上,我从未遇到过这种情况。

安装

要在项目中使用 Cerfing 与 AsyncSocket,请添加以下文件:

  • CerfingConnection.{h|m}
  • CerfingTransport.{h|m}
  • CerfingSerialization.{h|m}
  • CerfingAsyncSocketTransport.{h|m}
  • AsyncSocket (RunLoop 变体;从本仓库或原始发行版获取)

关于“传输”抽象的问题?

Cerfing 以前是一个单一的文件。这很好。然而,我希望能够跨多个不同的传输使用相同的协议。为了开始,我非常希望能够在一个游戏引擎中使用 UDP,但我不想破坏 Cerfing 连接到 TCP 上的其他用法。我想到的最直观的设计(尽管不是非常优雅)是在 Cerfing 和套接字之间添加一层——因此,有了传输层。向设计中添加层通常是一个反模式(尤其是当它只是一个添加很少抽象的绑定层时)。如果您有更好的设计,请告诉我。

如果您希望尽可能地使 Cerfing 成为单个类,git 标记 "1.0.0" 是稳定的且易于使用,而 "1.1.0" 是保留此 API 的最后一个 1.x 发行版。

名字"Cerfing"有何含义?

此项目最初名为TCAHP,或TCAsyncHashProtocol,这个名字很糟糕,发音也难以发音。当然,网络库是异步的;在ObjC中,“hash”并不是指“字典”;好吧,它确实是一个协议。

"Cerfing"是对Vint Cerf的致敬,他是我们所知道的互联网的原始创造者之一。通过“cerfing”,你可以快速组合网络协议,而不必过多地考虑实现细节。