如何在Cocoa套接字中发送格式正确的HTTP响应?

时间:2011-11-12 19:28:43

标签: macos cocoa sockets cocoaasyncsocket

我正在制作一个包含内置HTTP服务器的应用。我需要在套接字上发送一个PNG图像,但不知怎的,它变得混乱,图像不会显示出来。这是我的代码(我正在使用AsyncSockets):

if(processingURL == FALSE) {

        NSString *filePath = [[NSString alloc] initWithFormat:@"%@/Contents/Resources/public%@",[self getApplicationPath], [request objectAtIndex:1]];
        //NSLog(@"%@", filePath);


        if([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
            contententType = @"image/png";
            responseCode = @"200 OK";
         //   responseBody = [[NSString alloc] initWithData:[[NSFileManager defaultManager] contentsAtPath:filePath] encoding:NSASCIIStringEncoding];

            NSData * content = [[NSData alloc] initWithContentsOfFile:filePath];

            responseBody = [[NSString alloc] initWithData:content encoding:NSASCIIStringEncoding];

            NSLog(@"%@",responseBody);

        }
    }

    data = [[NSString stringWithFormat:@"HTTP/1.1 %@\nContent-Type: %@\n\n\n %@", responseCode, contententType, responseBody] dataUsingEncoding:NSUTF8StringEncoding];


    [sock writeData:data withTimeout:-1 tag:0];

我做错了什么?我认为问题是反应,这是错误的,但我不知道,谢谢:)

1 个答案:

答案 0 :(得分:1)

responseBody = [[NSString alloc] initWithData:content encoding:NSASCIIStringEncoding];

不要将任意文件内容数据视为文本。事实并非如此。

PNG不是ASCII文本文件;它包含您必须如此处理的二进制数据。这意味着要在整个过程中使用NSData,而不是试图将其转换为NSString的文本或将其解释为NSString的文本。

您应该创建的唯一字符串是响应代码和标头。从该字符串生成数据,然后将文件中的数据连接到该字符串并将其发送到服务器。