daily pastebin goal
8%
SHARE
TWEET

Untitled

a guest Nov 23rd, 2017 44 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. void MyTask::run()
  2. {
  3.     Core core(descriptor, exit);
  4.     core.exec();
  5. }
  6.    
  7. #define CHUNK 2048
  8. Core::Core(qintptr handle, bool *exit, QObject *parent)
  9.     : QEventLoop(parent), descriptor(handle)
  10. {
  11.     socket = new QTcpSocket(this);
  12.     socket->setSocketOption(QAbstractSocket::KeepAliveOption, 64);
  13.     socket->setSocketDescriptor(descriptor);
  14.  
  15.     //Подключаем сигналы сокета к слотам
  16.     connect(socket, &QTcpSocket::readyRead, this, &Core::onReadyRead);
  17.     connect(socket, &QTcpSocket::disconnected, this, &Core::onDisconnected);
  18. }
  19.  
  20. void Core::sendMessage(const QJsonValue &object)
  21. {
  22.     //Формируется стандартная шапка ответа сервера клиенту
  23.     //В параметр value передается объект с ответом под каждую комманду
  24.     QJsonObject message;
  25.     message.insert("ans", "ok");
  26.     message.insert("command", command);
  27.     message.insert("value", object);
  28.  
  29.     QJsonDocument doc(message);
  30.     auto data = doc.toJson(QJsonDocument::Compact);
  31.  
  32.     while(!data.isEmpty()){
  33.         socket->write(data.left(CHUNK));
  34.         data.remove(0, CHUNK);
  35.         if(!socket->waitForBytesWritten(10000)){
  36.             socket->disconnectFromHost();
  37.             quit();
  38.         }
  39.     }
  40. }
  41.    
  42. MyDialog::MyDialog(QTcpSocket *socket, QWidget *parent) : QDialog(parent), socket(socket)
  43. {
  44.     connect(this->socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(onError(QAbstractSocket::SocketError)));
  45. }
  46.  
  47. void MyDialog::onError(QAbstractSocket::SocketError)
  48. {
  49.     qDebug() << QTime::currentTime();
  50.     QMessageBox::warning(this, "Ошибка соединения", socket->errorString());
  51.     socket->disconnectFromHost();
  52.     errorStatus = true;
  53. }
  54.  
  55. void &MyDialog::sendMessage(const QJsonDocument &doc)
  56. {
  57.     errorStatus = false;
  58.     socket->connectToHost(ip, port, QIODevice::ReadWrite, QAbstractSocket::IPv4Protocol);
  59.     if(!socket->waitForConnected(5000)){
  60.         root = QJsonValue();
  61.         errorStatus = true;
  62.         return root;
  63.     }
  64.  
  65.     socket->write(doc.toJson(QJsonDocument::Compact));
  66.     QByteArray messageData;
  67.     while(1){
  68.         if(!socket->waitForReadyRead(5000)){
  69.             break;
  70.         }else{
  71.             messageData.append(socket->readAll());
  72.         }
  73.     }
  74.     socket->disconnectFromHost();
  75.  
  76.     ans = QJsonDocument::fromJson(messageData);
  77. }
RAW Paste Data
Top