代码之家  ›  专栏  ›  技术社区  ›  Nathan Osman

HTTP协议究竟是如何工作的?

  •  4
  • Nathan Osman  · 技术社区  · 14 年前

    我以为我已经弄清楚了,但现在我正在写一个网络服务器,有些东西不太正常。

    应用程序在端口上侦听传入的请求,当它接收到请求时,它将按顺序“r\n\r\n”读取所有内容。(因为这意味着邮件头的结尾-是的,我忽略了可能的投递数据。)

    现在,在它读了那么远之后,它将响应写入套接字:

    HTTP/1.1 200 OK\r\n
    Host: 127.0.0.1\r\n
    Content-type: text/html\r\n
    Content-length: 6\r\n
    \r\n
    Hello!
    

    但是,当Firefox或Chrome试图查看页面时,它不会显示。Chrome通知我:

    错误324(net::err_empty_response):未知错误。

    我做错什么了?


    下面是一些代码:

    QTcpSocket * pSocket = m_server->nextPendingConnection();
    
    // Loop thru the request until \r\n\r\n is found
    while(pSocket->waitForReadyRead())
    {
        QByteArray data = pSocket->readAll();
    
        if(data.contains("\r\n\r\n"))
            break;
    }
    
    pSocket->write("HTTP/1.0 200 OK\r\n");
    
    QString error_str = "Hello world!";
    
    pSocket->write("Host: localhost:8081\r\n");
    pSocket->write("Content-Type: text/html\r\n");
    pSocket->write(tr("Content-Length: %1\r\n").arg(error_str.length()).toUtf8());
    pSocket->write("\r\n");
    pSocket->write(error_str.toUtf8());
    
    delete pSocket;
    
    4 回复  |  直到 14 年前
        1
  •  6
  •   SingleNegationElimination    14 年前

    pSocket->waitForBytesWritten();
    
        2
  •  7
  •   Nathan Osman    14 年前

    pSocket->waitForBytesWritten();
    

        3
  •  0
  •   danorton    14 年前
        4
  •  0
  •   NVRAM    14 年前

    数控 ( 网络猫 )调试它。另外,你是否有可能发送两条新行?我不确定你的语言,所以如果你 print 附加新行,切换到:

    HTTP/1.1 200正常\r

    有一个小的日志记录/转发程序来调试套接字协议也很方便。我现在还不知道,但我已经用了很多年了,当我需要它的时候,它是我的救命稻草。

    [ 编辑 ] 试用使用