2010-09-14 89 views
0

我從TCP套接字連接中讀取數據,但服務器不時發送我\(這將標記消息的結尾)。因此,我沒有收到剩餘的消息。從TCP套接字接收完整的消息

我這樣寫的:

uint8_t buf[tcpBufferSize]; 
unsigned int len = 0; 

len = [inputStream read:buf maxLength:tcpBufferSize]; 

if(len > 0) { 
    NSMutableData* data=[[NSMutableData alloc] initWithLength:0]; 
    [data appendBytes: (const void *)buf length:len]; 
    NSString *s = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 

    //here s will be only the part before the \0 

    [s release]; 
    [data release]; 
} 

例如,如果服務器後\ 0結束標誌發送ABC \ 0deŸ只會ABC。

我怎麼能收到整個消息?

+1

我不知道有關Objective C的任何內容,但它看起來像是在嘗試將二進制數據填充到構建用於處理字符串的數據類型中('NSString')。在大多數語言中這是一個壞主意(除非那些區別),並且很可能是問題的根源。 – 2010-09-14 08:57:49

+2

另外,請注意,在TCP/IP級別沒有這樣的「消息」。它只是一個字節流。如果你想發送單獨的消息,你需要一些方法來傳遞字節流內每個消息的開始和結束(通過特殊的標記,或者通過發送一個包含消息長度的頭部,或者...)。 – 2010-09-14 08:58:51

+0

@Joachim:我認爲OP是在談論另一種類型的消息,即類型信息,而不是網絡傳輸類型。 – dreamlax 2010-09-15 08:24:00

回答

3

您很可能已收到整個郵件。一個字符串用於保存文本,而不是字節數據。如果要保留包含空字符的所有數據,則需要將其保留爲NSData對象。如果你想提取某些字節並將它們解釋爲文本,你必須自己實現。