From da4ee8637b187bb503de01cd06d0f16bd3827295 Mon Sep 17 00:00:00 2001 From: matlabbe Date: Wed, 6 Aug 2014 03:00:17 +0000 Subject: [PATCH] Added acknowledge to CameraTcpServer (a client must wait a response before sending images) git-svn-id: http://find-object.googlecode.com/svn/trunk/find_object@378 620bd6b2-0a58-f614-fd9a-1bd335dccda9 --- src/CameraTcpServer.cpp | 22 +++++------ src/CameraTcpServer.h | 6 +-- tools/tcpImagesServer/main.cpp | 2 +- tools/tcpRequest/main.cpp | 70 ++++++++++++++++++++-------------- 4 files changed, 55 insertions(+), 45 deletions(-) diff --git a/src/CameraTcpServer.cpp b/src/CameraTcpServer.cpp index 28399ea8..95f73650 100644 --- a/src/CameraTcpServer.cpp +++ b/src/CameraTcpServer.cpp @@ -17,14 +17,11 @@ CameraTcpServer::CameraTcpServer(quint16 port, QObject *parent) : QTcpServer(parent), blockSize_(0) { - this->setMaxPendingConnections(1); if (!this->listen(QHostAddress::Any, port)) { UERROR("Unable to start the Camera TCP server: %s", this->errorString().toStdString().c_str()); return; } - - connect(this, SIGNAL(newConnection()), this, SLOT(addClient())); } cv::Mat CameraTcpServer::getImage() @@ -83,22 +80,23 @@ quint16 CameraTcpServer::getPort() const return this->serverPort(); } -void CameraTcpServer::addClient() +void CameraTcpServer::incomingConnection(int socketDescriptor) { - QTcpSocket * client = this->nextPendingConnection(); - QList clients = this->findChildren(); - if(clients.size() > 1) + if(clients.size() >= 1) { UWARN("A client is already connected. Only one connection allowed at the same time."); - client->close(); - client->deleteLater(); + QTcpSocket socket; + socket.setSocketDescriptor(socketDescriptor); } else { - connect(client, SIGNAL(readyRead()), this, SLOT(readReceivedData())); - connect(client, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(displayError(QAbstractSocket::SocketError))); - connect(client, SIGNAL(disconnected()), this, SLOT(connectionLost())); + QTcpSocket * socket = new QTcpSocket(this); + connect(socket, SIGNAL(readyRead()), this, SLOT(readReceivedData())); + connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(displayError(QAbstractSocket::SocketError))); + connect(socket, SIGNAL(disconnected()), this, SLOT(connectionLost())); + socket->setSocketDescriptor(socketDescriptor); + socket->write(QByteArray("1")); } } diff --git a/src/CameraTcpServer.h b/src/CameraTcpServer.h index 3d16a0ca..171bf5f7 100644 --- a/src/CameraTcpServer.h +++ b/src/CameraTcpServer.h @@ -23,14 +23,14 @@ public: QHostAddress getHostAddress() const; quint16 getPort() const; +protected: + virtual void incomingConnection ( int socketDescriptor ); + private Q_SLOTS: void readReceivedData(); void displayError(QAbstractSocket::SocketError socketError); void connectionLost(); -private Q_SLOTS: - void addClient(); - private: quint64 blockSize_; QVector images_; diff --git a/tools/tcpImagesServer/main.cpp b/tools/tcpImagesServer/main.cpp index 82976efa..e9a38e73 100644 --- a/tools/tcpImagesServer/main.cpp +++ b/tools/tcpImagesServer/main.cpp @@ -99,7 +99,7 @@ int main(int argc, char * argv[]) } server.connectToHost(ipAddress, port); - if(!server.waitForConnected()) + if(!server.waitForReadyRead()) { printf("ERROR: Unable to connect to %s:%d\n", ipAddress.toStdString().c_str(), port); return -1; diff --git a/tools/tcpRequest/main.cpp b/tools/tcpRequest/main.cpp index debf81fc..2d3add96 100644 --- a/tools/tcpRequest/main.cpp +++ b/tools/tcpRequest/main.cpp @@ -148,6 +148,9 @@ int main(int argc, char * argv[]) QObject::connect(&response, SIGNAL(detectionReceived()), &app, SLOT(quit())); QObject::connect(&response, SIGNAL(disconnected()), &app, SLOT(quit())); + QObject::connect(&request, SIGNAL(disconnected()), &app, SLOT(quit())); + QObject::connect(&response, SIGNAL(error(QAbstractSocket::SocketError)), &app, SLOT(quit())); + QObject::connect(&request, SIGNAL(error(QAbstractSocket::SocketError)), &app, SLOT(quit())); request.connectToHost(ipAddress, portOut); response.connectToHost(ipAddress, portIn); @@ -164,7 +167,6 @@ int main(int argc, char * argv[]) return -1; } - // publish image std::vector buf; cv::imencode(".png", image, buf); @@ -176,48 +178,58 @@ int main(int argc, char * argv[]) out.writeRawData((char*)buf.data(), (int)buf.size()); out.device()->seek(0); out << (quint64)(block.size() - sizeof(quint64)); - request.write(block); - printf("Image published, waiting for response...\n"); - QTime time; - time.start(); - // wait for response - app.exec(); - - if(response.dataReceived()) + if(request.waitForReadyRead()) { - printf("Response received! (%d ms)\n", time.elapsed()); - // print detected objects - if(response.info().objDetected_.size()) + qint64 bytes = request.write(block); + printf("Image published (%d bytes), waiting for response...\n", (int)bytes); + QTime time; + time.start(); + + // wait for response + app.exec(); + + if(response.dataReceived()) { - QList ids = response.info().objDetected_.uniqueKeys(); - for(int i=0; i ids = response.info().objDetected_.uniqueKeys(); + for(int i=0; i