2013-07-12 54 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

行!我會試一試。我認爲也許有一種「優雅」的解決方案。謝謝! –