2013-07-12 238 views
0

我已经用Python编写了一个服务器(Twisted),现在想连接它与iOS,但有一些麻烦。NSStream,发送/接收数据

这是我如何连接到服务器:

CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"localhost", 3000, &readStream, &writeStream); 
inputStream = (NSInputStream *)readStream; 
outputStream = (NSOutputStream *)writeStream; 
[inputStream setDelegate:self]; 
[outputStream setDelegate:self]; 
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
[inputStream open]; 
[outputStream open]; 

问题自带RunLoop。想象一下,我不想向服务器发送一条消息。然后我会这样做:

NSData *data = [[NSData alloc] initWithData:[message dataUsingEncoding:NSASCIIStringEncoding]]; 
[outputStream write:[data bytes] maxLength:[data length]]; 

但是如果我不想发送两个消息,一个接一个?然后我可以运行带有message1和message2的代码...但是客户端发送的是message1 + message2的并置,而不是两个不同的消息。我想这是因为我在相同的“循环”中将消息写入outputStream,所以当流最终决定发送数据时,它将同时发送......我找不出任何解决方案。如果SERVER以非常快的速度向CLIENT发送多条消息,则会发生同样的情况。我该怎么办?

+0

是有,你可以调用任何冲洗方法? –

+0

@NicolasManzini我不这么认为......我在谷歌搜索,没有发现任何东西。我是新来的服务器,TCP,流... –

回答

0

定义“协议” - 基本上是定义参与者将理解的“语言”的“语法”。

最简单的方法是定义令牌和分隔符以及相应的解析器。

例如,你可以定义一个消息由单一的炭,和多个消息将通过一个或多个空间分开。然后你就可以发送此通过线路:

A B C dé

+0

感谢您的答案。实际的协议是类似命令/数据,我想我可以做一些像cmd1/data1_cmd2/data2,...这里的问题是,当SERVER向CLIENT发送一些数据时,它有一个1024B缓冲区...我知道分离的“数据包”(CMD /数据)不会超过1024Bytes,但是如果发送多于一个的话......另外,恐怕SERVER发送X字节可能会在第一个“runLoop” Y字节,其余(XY)字节在下一个循环中。 –

+0

当然。因此,你需要在一个足够大的“命令缓冲区”中累加接收到的字节,直到你得到一个完整的命令,而“参数”又称为数据。行! – CouchDeveloper

+0

行!我会试一试。我认为也许有一种“优雅”的解决方案。谢谢! –