在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();
}
答案 0 :(得分:0)
在尝试不同的HTTP标头配置一整天后,它现在正常工作。似乎用户'peppe'正在做某件事,我唯一需要的就是在标题后添加“\ r \ n”! (见编辑)。