QTcpSocket不刷新HTTP头(Comet模式)

时间:2016-04-03 13:14:49

标签: javascript qt http comet qtcpsocket

在Qt中实现一个简单的HTTP服务器,目的是将实时数据流式传输到XMLHttpRequest对象(AJAX / JavaScript)。

问题是设计模式需要通过套接字连接部分传输数据,从而改变XHR中的readyState来自' 1' (请求)到' 2' (收到标题),然后到#3;' (收到的数据) - 保持请求未决。这也被称为"长轮询"或" Comet"并且应该可以在大多数浏览器中使用。

但是,它会一直处于请求状态,直到连接关闭,然后是readyState' 2'和' 4'收到了。这对于HTTP GET来说是正常的,但不适用于此应用程序。

JavaScript的:

var request = new XMLHttpRequest();
request.onreadystatechange = function() {
    console.log('readyState: ' + this.readyState + ' ' + this.status)
}
request.open("get", "localhost:8080/", true);
request.send();

Qt的:

connect(socket, &QTcpSocket::readyRead, [=]()
{
    QByteArray data = m_socket->read(1000);

    socket->write("HTTP/1.1 200 OK\r\n");
    socket->write("Content-Type: text/octet-stream\r\n");
    socket->write("Access-Control-Allow-Origin: *\r\n");
    socket->write("Cache-Control: no-cache, no-store, max-age=0, must-revalidate\r\n");
    socket->flush();
}

所以最大的问题是:如何在编写标题(以及后来的数据)之后使网络系统在QtTcpSocket下面刷新待处理数据,而不需要先断开连接?

附注:我最初是使用WebSockets实现的,但我必须使用的浏览器不支持此功能。

修改 HTTP标头格式必须有一组额外的" \ r \ n"。现在它起作用了:

connect(socket, &QTcpSocket::readyRead, [=]()
{
    QByteArray data = m_socket->read(1000);

    socket->write("HTTP/1.1 200 OK\r\n");
    socket->write("Content-Type: text/octet-stream\r\n");
    socket->write("Access-Control-Allow-Origin: *\r\n");
    socket->write("Cache-Control: no-cache, no-store, max-age=0, must-revalidate\r\n");
    socket->write("\r\n");
    socket->flush();
}

1 个答案:

答案 0 :(得分:0)

在尝试不同的HTTP标头配置一整天后,它现在正常工作。似乎用户'peppe'正在做某件事,我唯一需要的就是在标题后添加“\ r \ n”! (见编辑)。