gpt4 book ai didi

c++ - 使用 QTcpSocket 时出错

转载 作者:行者123 更新时间:2023-11-30 02:31:54 25 4
gpt4 key购买 nike

我正在创建一个(非常基本的)MJPG 服务器来在浏览器上显示网络摄像头数据。到目前为止,我已经部分做到了。

这是我的代码:

TcpServer::TcpServer(QObject *parent) :
QObject(parent)
{
server = new QTcpServer(this);
// whenever a user connects, it will emit signal
connect(server, SIGNAL(newConnection()),
this, SLOT(newConnection()));
if (!server->listen(QHostAddress::Any, 9999))
qDebug() << "Server could not start";
else
qDebug() << "Server started!";
}
...
void TcpServer::newConnection()
{
QTcpSocket *socket = server->nextPendingConnection();
QByteArray ContentType = ("HTTP/1.0 200 OK\r\n" \
"Cache-Control: no-cache\r\n" \
"Cache-Control: private\r\n" \
"Content-Type: multipart/x-mixed-replace;boundary=--boundary\r\n");
socket->write(ContentType);
std::vector<uchar> buff;
Mat img; //OpenCV Material
while (1) {
// Image to Byte Array via OPENCV Method
buff.clear();buff.empty();
vCapture->read(img); //Read from webcam

imencode(".jpg", img, buff, compression_params);
std::string content(buff.begin(), buff.end());
QByteArray CurrentImg(QByteArray::fromStdString(content));
QByteArray BoundaryString = ("--boundary\r\n" \
"Content-Type: image/jpeg\r\n" \
"Content-Length: ");
BoundaryString.append(QString::number(CurrentImg.length()));
BoundaryString.append("\r\n\r\n");

socket->write(BoundaryString);
socket->write(CurrentImg); // Write The Encoded Image
socket->flush();
}

问题-

当我运行这个程序时,会显示第一张图片。之后app上不断打印出如下错误-

QIODevice::write (QTcpSocket): device not open

看起来套接字已关闭,所以我重新初始化了套接字,就像这样 - socket = server->nextPendingConnection();,尽管应用程序抛出了此代码的错误。关于如何解决此问题的任何帮助?

编辑 -

我尝试了 lambda 方法,它运行良好。但是,我仍然面临 2 个问题 -

  1. 图像尺寸必须过小(大约 270x480,JPG 质量最低)

  2. (更重要)我必须手动按下浏览器上的重新加载按钮来重新加载图像,它不会自动从一张图像更改为另一张图像。

最佳答案

It looked like the socket got closed

与其猜测,不如连接到 TCPServerTCPSocket 的错误信号,以了解何时发生错误或客户端何时断开连接。

您遇到的问题是 while(1) 循环。 Qt 是一个 event-driven框架,因此在主线程上将代码置于无限循环中将阻止传递事件。

代替无限循环,连接到QTcpSocket::readyRead调用连接的插槽时发出信号并处理数据。

Qt 用 Fortune Server 演示了这一点和 Fortune Client示例代码。

如果您使用 C++ 11 ,您可以使用与 lambda 函数的连接来处理 readyRead,就像这样

void TcpServer::newConnection()
{
...

QTcpSocket *m_TcpHttpClient = server->nextPendingConnection();
connect(m_TcpHttpClient, &QTcpSocket::readyRead, [=](){

// handle received data here

});

}

关于c++ - 使用 QTcpSocket 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37025383/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com