【问题标题】:Receiving complete message from TCP socket从 TCP 套接字接收完整的消息
【发布时间】:2010-09-14 16:58:24
【问题描述】:

我从 TCP 套接字连接读取数据,但服务器不时向我发送 \0(这将标志着消息的结束)。因此,我没有收到消息的其余部分。

我是这样读的:

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];
}

例如,如果服务器发送 abc\0de y 将只得到 abc,因为 \0 表示结束。

我怎样才能收到整个消息??

【问题讨论】:

  • 我对Objective C一无所知,但看起来您正在尝试将二进制数据填充到为处理字符串而构建的数据类型中(NSString)。在大多数语言中这是一个坏主意(除了那些不区分的语言),而且很可能是问题的根源。
  • 另外,请注意在 TCP/IP 级别没有“消息”之类的东西。它只是一个字节流。如果您想发送单独的消息,您需要某种方式在字节流中传达每条消息的开始和结束(通过特殊标记,或通过发送带有消息长度的标头,或...)。跨度>
  • @Joachim:我认为 OP 是在谈论另一种消息,即邮件类型,而不是网络传输类型。
  • @dreamlax:你在说什么?在那个层面上不存在任何类型的消息,除非你让它存在于代码中。而那段代码并没有做那样的事情。
  • 对于消息,我的意思是服务器发送的完整命令。在我的例子中,它是一个完整的 xml 节点,以 \0 结尾,例如 "\0" 或 "\0"

标签: objective-c sockets tcp nsstring nsdata


【解决方案1】:

您很可能已收到整条消息。字符串用于保存文本,而不是字节数据。如果要保留包括空字符在内的所有数据,则需要将其保留为NSData 对象。如果您想提取某些字节并将它们解释为文本,则必须自己实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多