HTTP协议如何正常工作?

Nat*_*man 4 sockets connection qt header http

我以为我已经想到了这一切,但现在我正在写一个网络服务器,有些东西不太正常.

应用程序在端口上侦听传入的请求,当收到请求时,它会读取所有内容,直到序列"\ r \n \n \n \n".(因为这表示标题的结尾 - 是的,我忽略了可能的POST数据.)

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

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!
Run Code Online (Sandbox Code Playgroud)

但是,当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;
Run Code Online (Sandbox Code Playgroud)

Nat*_*man 7

我想到了!

在将数据写入套接字后,我必须调用:

pSocket->waitForBytesWritten();
Run Code Online (Sandbox Code Playgroud)

...或者缓冲区没有输出.


Sin*_*ion 6

可能问题是你没有在删除套接字之前刷新并关闭套接字吗?

编辑:乔治爱迪生回答了他自己的问题,但很友好地接受了我的回答.这是适合他的代码:

pSocket->waitForBytesWritten();
Run Code Online (Sandbox Code Playgroud)