connect(tcpSocket,SIGNAL(connected()),this,SLOT(on_connected()));connect(tcpSocket,SIGNAL(disconnected()),this,SLOT(on_disconnected()));connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(on_data()));
void MainWindow::on_data(){ while(tcpSocket->bytesAvailable()) { QByteArray data=tcpSocket->readAll(); packetSplitter->setByteArray(&data,data.length()); }}
qDebug()<<this->thread()
myThread.start()
TCPClientQt::TCPClientQt(): QTcpSocket().....m_pTcpSocket = new QTcpSocket(this);
connect(m_pTcpSocket, SIGNAL(connected()), SLOT(slotConnected())); connect(m_pTcpSocket, SIGNAL(disconnected()), SLOT(slotDisconnected())); connect(m_pTcpSocket, SIGNAL(readyRead()), SLOT(slotReadyRead()));
connect(m_pTcpSocket, SIGNAL(error(QAbstractSocket::SocketError)),this, SLOT(slotError(QAbstractSocket::SocketError))); connect(m_pTcpSocket, SIGNAL(stateChanged(QAbstractSocket::SocketState socketState )),this, SLOT(slotStateChanged(QAbstractSocket::SocketState)));
ReadData::ReadData(QObject *parent) : QThread(parent).....void ReadData::run(){ try { m_Client=new TCPClientQt(this); exec(); }catch(const std::exception& ex) { m_Result=-2; } }
C++ (Qt) ReadData *thread; TCPClientQt s_Client;..... thread=new ReadData(this); QObject::connect(&s_Client,SIGNAL(sig_Connected()),this, SLOT(slotIsConnected()),Qt::AutoConnection); QObject::connect(&s_Client,SIGNAL(sig_newInfo()),this, SLOT(getNewInfo()),Qt::AutoConnection); QObject::connect(&s_Client,SIGNAL(sig_Disconnected()),this, SLOT(slotIsDisonnected()),Qt::AutoConnection); s_Client.moveToThread(thread);
C++ (Qt)//work connect(m_pTcpSocket, SIGNAL(connected()), SLOT(slotConnected())); connect(m_pTcpSocket, SIGNAL(disconnected()), SLOT(slotDisconnected())); connect(m_pTcpSocket, SIGNAL(readyRead()), SLOT(slotReadyRead()));//not work connect(m_pTcpSocket, SIGNAL(error(QAbstractSocket::SocketError)),this, SLOT(slotError(QAbstractSocket::SocketError))); connect(m_pTcpSocket, SIGNAL(stateChanged(QAbstractSocket::SocketState socketState )),this, SLOT(slotStateChanged(QAbstractSocket::SocketState)));
C++ (Qt)class ReadData : public QThread{ Q_OBJECT private: int m_Result; public: explicit ReadData(QObject *parent = 0); ~ReadData(); void run(); signals: public slots: };
C++ (Qt)ReadData::ReadData(QObject *parent) : QThread(parent){ //moveToThread(this);//пробовал тут, но поток сам в себя лезть не хочет :) m_Result=-1;} void ReadData::run(){ try { exec(); }catch(const std::exception& ex) { m_Result=-2; } } ReadData::~ReadData(){ }
C++ (Qt)class TCPClientQt : public QTcpSocket{Q_OBJECT public: explicit TCPClientQt(); ~TCPClientQt(); bool slotStartData(QString _cmdStart); bool m_IsConnected; int m_IsThread;//если в отдельном потоке, то выставляем 1 int m_RecivedBytes;//сколько байт забрали из буфера QString m_StrInfo; QString m_CmdCfg; QString m_AnswerCfg; QString m_CmdStart; QString m_AnswerStart; QString m_CmdStop; QString m_AnswerStop; QString m_CmdGetTimer; QString m_CmdResetTimer; QString m_CmdResetADC; QTcpSocket *m_pTcpSocket; QFile m_LogFile; QString m_ApplPath; QByteArray arrReadBlock; //function QByteArray getCurrentData();private: //адрес и порт QString m_strHost; int m_nPort; //это команда bool isCmd; //завершение данных bool isEnd; //сколько ожидаем uint ExpectedBytes; //сколько получили uint totalBytesRecived; //сколько забрали из массива uint currentPos; //QByteArray m_bufferRead; signals: void sig_newInfo(); void sig_Connected(); void sig_Disconnected(); //private slots: public slots: void slotReadyRead(); void slotError (QAbstractSocket::SocketError); void slotSendToServer(QString _cmdSend); void slotConnected(); void slotDisconnected(); void slotStateChanged ( QAbstractSocket::SocketState socketState ); void slotConnectToServer(QString _ipHost); void slotClearLog(); void slotCloseConnect(); };
C++ (Qt)TCPClientQt::TCPClientQt(): QTcpSocket()//{ m_strHost="192.168.1.7";//strHost; m_nPort=32000;//nPort; m_CmdCfg="+WIND:80:";//конфигурация префикс команды m_AnswerCfg="+WIND:81:";//конфигурация префикс ответ m_CmdStart="+WIND:82:";//старт команда m_AnswerStart="+WIND:83:";//старт префикс ответ m_CmdStop="+WIND:84:";//стоп команда m_AnswerStop="+WIND:85:";//стоп префикс ответ m_CmdGetTimer="+WIND:89:";//запрос таймера m_CmdResetTimer="+WIND:88:";//сброс таймера m_CmdResetADC="+WIND:99:";//сброс АЦП m_pTcpSocket = new QTcpSocket(this); m_ApplPath=QCoreApplication::applicationDirPath(); m_LogFile.setFileName(m_ApplPath+"/TCPClientQt.log"); m_StrInfo="Empty"; m_IsThread=0; m_RecivedBytes=0; m_IsConnected=false; //признак наличия команды isCmd=false; isEnd=false; ExpectedBytes=0; totalBytesRecived=0; currentPos=0; arrReadBlock.clear(); connect(m_pTcpSocket, SIGNAL(connected()), SLOT(slotConnected())); connect(m_pTcpSocket, SIGNAL(disconnected()), SLOT(slotDisconnected())); connect(m_pTcpSocket, SIGNAL(readyRead()), SLOT(slotReadyRead())); connect(m_pTcpSocket, SIGNAL(error(QAbstractSocket::SocketError)),this, SLOT(slotError(QAbstractSocket::SocketError))); connect(m_pTcpSocket, SIGNAL(stateChanged(QAbstractSocket::SocketState socketState )),this, SLOT(slotStateChanged(QAbstractSocket::SocketState)));} void TCPClientQt::slotClearLog(){ //m_ptxtInfo->clear();} void TCPClientQt::slotCloseConnect(){ if(m_pTcpSocket->state() == QAbstractSocket::UnconnectedState) { m_StrInfo="Нет открытого сокета"; }else{ m_pTcpSocket->close(); m_IsConnected=false; m_StrInfo="Сокет закрыт"; } if(m_LogFile.isOpen()) { QByteArray arr=m_StrInfo.toAscii()+"\n"; m_LogFile.write(arr); m_LogFile.close(); } emit sig_Disconnected(); emit sig_newInfo();} void TCPClientQt::slotSendToServer(QString _cmdSend){ if(m_pTcpSocket->state() == QAbstractSocket::ConnectedState) { m_StrInfo=QTime::currentTime().toString("hh:mm:ss.zzz")+" Отправка команды "+_cmdSend; emit sig_newInfo(); if(m_LogFile.isOpen()) { QByteArray arr=m_StrInfo.toAscii()+"\n"; m_LogFile.write(arr); } currentPos=0; }else { m_StrInfo=QTime::currentTime().toString("hh:mm:ss.zzz")+" Нет открытого соединения!"; emit sig_newInfo(); return; } QByteArray arrSend; QString cmdSend=_cmdSend; arrSend=cmdSend.toAscii(); m_pTcpSocket->write(arrSend); if(m_LogFile.isOpen()) { QByteArray arr=m_StrInfo.toAscii()+"\n"; m_LogFile.write(arr); }} void TCPClientQt::slotReadyRead(){ //доступно байт в текущий момент uint bytesAvailable=0; //полученные текущие байты QByteArray currArr; //для перегона в строку, если команда или ответ QByteArray strArr; //полученная строка ответа по команде старт QByteArray strAnswerStart;//размер ответа в байтах //яя int pos=-1; //размер команды с ответом uint sizeCmd=20; //int bytesArray=0; //Цикл нужен потому, что с сервера не все данные могут прийти одновременно. //Поэтому клиент должен быть в состоянии получать как весь блок целиком, //так и только часть блока или даже все блоки сразу. m_RecivedBytes=0; isEnd=false; isCmd=false; if(m_pTcpSocket->state() == QAbstractSocket::UnconnectedState) { m_StrInfo=QTime::currentTime().toString("hh:mm:ss.zzz")+" UnconnectedState"; if(m_LogFile.isOpen()) { QByteArray arr=m_StrInfo.toAscii()+"\n"; m_LogFile.write(arr); } emit sig_newInfo(); return; } while(true){ strArr.clear(); currArr.clear(); bytesAvailable=m_pTcpSocket->bytesAvailable(); if(bytesAvailable < sizeof(quint16)){ //нет данных m_StrInfo=QTime::currentTime().toString("hh:mm:ss.zzz")+" bytesAvailable 0 Пусто"; if(m_LogFile.isOpen()) { QByteArray arr=m_StrInfo.toAscii()+"\n"; m_LogFile.write(arr); } emit sig_newInfo(); break; }else { // } //есть данные totalBytesRecived=totalBytesRecived+bytesAvailable; currArr=m_pTcpSocket->read(bytesAvailable); arrReadBlock.append(currArr); //если кусочек менее 20 байт if(bytesAvailable<sizeCmd && !currArr.contains(m_AnswerStop.toAscii())){ strArr=currArr.left(sizeCmd); //ответ конфигурации if(currArr.contains(m_AnswerCfg.toAscii())) { strArr=currArr.left(17); m_StrInfo=QTime::currentTime().toString("hh:mm:ss.zzz")+" Answer CFG " +QString::fromAscii(strArr); if(m_LogFile.isOpen()) { QByteArray arr=m_StrInfo.toAscii()+"\n"; m_LogFile.write(arr); } emit sig_newInfo(); }else { // } if(currArr.contains(m_CmdGetTimer.toAscii())) { strArr=currArr.left(20); m_StrInfo=QTime::currentTime().toString("hh:mm:ss.zzz")+" Answer GetTimer " +QString::fromAscii(strArr); if(m_LogFile.isOpen()) { QByteArray arr=m_StrInfo.toAscii()+"\n"; m_LogFile.write(arr); } emit sig_newInfo(); }else { // } if(currArr.contains(m_CmdResetTimer.toAscii())) { strArr=currArr.left(20); m_StrInfo=QTime::currentTime().toString("hh:mm:ss.zzz")+" Answer ResetTimer " +QString::fromAscii(strArr); if(m_LogFile.isOpen()) { QByteArray arr=m_StrInfo.toAscii()+"\n"; m_LogFile.write(arr); } emit sig_newInfo(); }else { // } isCmd=true; break; }else{ m_StrInfo=QTime::currentTime().toString("hh:mm:ss.zzz") +" bytesAvailable "+QString::number(bytesAvailable); if(m_LogFile.isOpen()) { QByteArray arr=m_StrInfo.toAscii()+"\n"; m_LogFile.write(arr); } emit sig_newInfo(); } //есть начало +WIND:83: if(currArr.contains(m_AnswerStart.toAscii())) { isCmd=false; pos=17; strArr=currArr.left(pos); m_StrInfo=QTime::currentTime().toString("hh:mm:ss.zzz") +" Begin "+QString::fromAscii(strArr); if(m_LogFile.isOpen()) { QByteArray arr=m_StrInfo.toAscii()+"\n"; m_LogFile.write(arr); } //выясняем, сколько байт должно прилететь исходя из заголовка ответа сервера +WIND:83:XX:XX:XX //разбор заголовка strAnswerStart.clear(); strAnswerStart.append(strArr.data()[9]); strAnswerStart.append(strArr.data()[10]); int F=strAnswerStart.toInt(); strAnswerStart.clear(); strAnswerStart.append(strArr.data()[12]); strAnswerStart.append(strArr.data()[13]); int C=strAnswerStart.toInt(); strAnswerStart.clear(); strAnswerStart.append(strArr.data()[15]); strAnswerStart.append(strArr.data()[16]); int T=strAnswerStart.toInt(); strAnswerStart.clear(); //сколько байт ExpectedBytes=F*1000*C*T+34; emit sig_newInfo(); }else{ // } //есть конец if(currArr.contains(m_AnswerStop.toAscii())) { isEnd=true; pos=arrReadBlock.indexOf(m_AnswerStop); strArr=currArr.right(17); m_StrInfo=QTime::currentTime().toString("hh:mm:ss.zzz") +" End "+QString::fromAscii(strArr); if(m_LogFile.isOpen()) { QByteArray arr=m_StrInfo.toAscii()+"\n"; m_LogFile.write(arr); } emit sig_newInfo(); break; }else{ // } //и на новый цикл после ожидания m_pTcpSocket->waitForReadyRead(550);//время ожидания очередного пакета в мс } //завершение приема данных if(isEnd) { m_StrInfo=QTime::currentTime().toString("hh:mm:ss.zzz") +" Total Expected: " +QString::number(ExpectedBytes); if(m_LogFile.isOpen()) { QByteArray arr=m_StrInfo.toAscii()+"\n"; m_LogFile.write(arr); } emit sig_newInfo(); m_StrInfo=QTime::currentTime().toString("hh:mm:ss.zzz") +" Total Recive: " +QString::number(totalBytesRecived); if(m_LogFile.isOpen()) { QByteArray arr=m_StrInfo.toAscii()+"\n"; m_LogFile.write(arr); } emit sig_newInfo(); m_StrInfo=QTime::currentTime().toString("hh:mm:ss.zzz") +" Lost: " +QString::number(ExpectedBytes-totalBytesRecived); if(m_LogFile.isOpen()) { QByteArray arr=m_StrInfo.toAscii()+"\n"; m_LogFile.write(arr); } emit sig_newInfo(); isEnd=false; } totalBytesRecived=0; ExpectedBytes=0; arrReadBlock.clear(); return;} void TCPClientQt::slotError(QAbstractSocket::SocketError err){ QString strError = (err == QAbstractSocket::HostNotFoundError ? "The host was not found. "+QString::number(-1) : err == QAbstractSocket::RemoteHostClosedError ? "The remote host is closed. "+QString::number(-2) : err == QAbstractSocket::ConnectionRefusedError ? "The connection was refused. "+QString::number(-3) : QString(m_pTcpSocket->errorString()) ); m_StrInfo=QTime::currentTime().toString("hh:mm:ss.zzz")+" Error: "+strError; if(m_LogFile.isOpen()) { QByteArray arr=m_StrInfo.toAscii()+"\n"; m_LogFile.write(arr); } emit sig_newInfo();} void TCPClientQt::slotStateChanged(QAbstractSocket::SocketState socketState){ m_StrInfo=QTime::currentTime().toString("hh:mm:ss.zzz")+" StateChanged"; if(m_LogFile.isOpen()) { QByteArray arr=m_StrInfo.toAscii()+"\n"; m_LogFile.write(arr); }} void TCPClientQt::slotConnected(){ m_StrInfo=QTime::currentTime().toString("hh:mm:ss.zzz")+" Connected"; m_IsConnected=true; emit sig_Connected(); emit sig_newInfo(); if(!m_LogFile.isOpen()) { m_LogFile.open(QIODevice::ReadWrite); m_LogFile.seek(m_LogFile.size()); QByteArray arr=m_StrInfo.toAscii()+"\n"; m_LogFile.write(arr); }} void TCPClientQt::slotDisconnected(){ m_StrInfo=m_StrInfo=QTime::currentTime().toString("hh:mm:ss.zzz")+" Disconnected"; if(m_LogFile.isOpen()) { QByteArray arr=m_StrInfo.toAscii()+"\n"; m_LogFile.write(arr); m_LogFile.close(); } m_IsConnected=false; emit sig_Disconnected();} QByteArray TCPClientQt::getCurrentData(){ QByteArray result; ..... return result;} void TCPClientQt::slotConnectToServer(QString _ipHost){ if(m_pTcpSocket!=0) { if(m_pTcpSocket->state() == QAbstractSocket::UnconnectedState) { m_strHost=_ipHost; m_pTcpSocket->connectToHost(m_strHost, m_nPort); }else{ m_StrInfo=QTime::currentTime().toString("hh:mm:ss.zzz")+" Есть открытое соединение"; emit sig_newInfo(); } }else { // } if(m_LogFile.isOpen()) { QByteArray arr=m_StrInfo.toAscii()+"\n"; m_LogFile.write(arr); }} TCPClientQt::~ TCPClientQt (){ if(m_LogFile.isOpen()) { m_LogFile.close(); } if(m_pTcpSocket!=0) { if(m_pTcpSocket->state() != QAbstractSocket::UnconnectedState) { m_pTcpSocket->close(); }else { // } m_pTcpSocket=0; }}
C++ (Qt)ReadData::ReadData(QObject *parent) : QThread(parent){ m_Client=new TCPClientQt(this); QObject::connect(m_Client,SIGNAL(sig_Connected()),this->parent(), SLOT(slotIsConnected()),Qt::AutoConnection); QObject::connect(m_Client,SIGNAL(sig_newInfo()),this->parent(), SLOT(getNewInfo()),Qt::AutoConnection); QObject::connect(m_Client,SIGNAL(sig_Disconnected()),this->parent(), SLOT(slotIsDisonnected()),Qt::AutoConnection); moveToThread(this);}//тест кодировки
C++ (Qt)void TCPClientQt::slotError(QAbstractSocket::SocketError err)
C++ (Qt)void connect(m_pTcpSocket, SIGNAL(readyRead()), SLOT(slotReadyRead()));