套接字通信:有没有任何zeromq lib在您的iOS项目中工作?

时间:2012-02-02 08:46:10

标签: objective-c ios cocoa-touch sockets zeromq

目前,我正在尝试让lib在我的项目中工作,但没有结果。我将其源类和objective-c包装类(ZMQContext,ZMQSocket)复制到我的项目中,并能够成功构建它。但是,当我尝试向服务器发送请求时,我得到“资源临时不可用”。这是我的代码:

ZMQContext *context = [[ZMQContext alloc] initWithIOThreads:1];    
ZMQSocket *socket =[context socketWithType:ZMQ_REQ];    
BOOL success = [socket connectToEndpoint:@"tcp://X.X.X.X:X"];

if (success){
    NSLog(@"connected to server");
}

NSData *data = [self RequestData];

success = [socket sendData:data withFlags:0];

if (success){
    NSLog(@"Data sent to server");
}

不知何故,“connectToEndpoint”调用成功,但是我不能对发送说同样的话。我可以通过端口确保主机可以访问,因为服务器端套接字通信版本已经处于生产状态。只是好奇,有没有人为zeromq工作过iOS?

更新:我也向github项目here发布了同样的问题并得到了答案:“你只在这里显示代码的一面。如果对方没有运行ZMQ,你将会自然无法交换信息。“这意味着我们不能仅将ZMQ用作客户端(使用其他lib或自定义解决方案实现的现有服务器)。如果这是真的那么ZMQ是非常有限的。

1 个答案:

答案 0 :(得分:1)

对于那些偶然发现ZeroMQ应用的人,我会稍微澄清一下,因为缺乏关于这些东西是如何工作的基本信息。在我的情况下,我有现有的服务器通过套接字接受连接,因此可以发送和接收数据。通过套接字的所有数据都通过tcp数据包(低级别),但您不必担心数据在tcp数据包中的传输方式。使用套接字,您需要知道的一切是您需要构造一个字节包并将其发送到服务器。服务器还会返回一个字节数据包,您将负责解释这些字节。例如,如果我想向服务器发送2个字节的数据,例如1个字节的值1和另一个字节值2,我将需要构造并发送00000001 00000010(无空间:))。服务器也会返回一些字节。

事情是与原始套接字通信,你有手动实现协议 - 规则。为什么?因为如果收到的数据包长度正确,您可以手动检查收到的数据包是否正确。服务器和客户端必须同意数据格式是什么,哪个字节是状态,哪些字节表示数据包长度,哪些字节表示数据。例如,假设服务器正在向您发送原始字节:

10001000 10010111 01101001 01111110 01110110 11100001

客户端和服务器都需要知道每个字节的含义。所以,在我的情况下,服务器已经拥有它自己的解析器和规则(它可能被命名为自定义协议),关于应该来自哪个字节序列。例如,1个字节是请求命令,4个字节是数据包大小,1个字节是请求状态,其余字节是数据。当您使用HTTP等更高协议与服务器进行通信时,所有内容都是免费完成的,您只需推送或抓取数据就可以了。此外,与ZeroMQ类似,因为它已经有自己的解析规则,因此您只需推送并获取数据,但如前所述,客户端和服务器都需要使用该lib。

当我发布问题时,我正在寻找一些便于套接字通信的lib,但它没有自己的协议。目前,我正在尝试使用AsyncSocket。