Название: Опять сокеты
Отправлено: BuRn от Февраль 19, 2015, 23:30
Пишу в сокет, но в результате, получаю почему-то при считывании данных с сокета одно и тоже, происходит запись в сокет со стороны клиент за 1 сек примерно 300 раз, на стороне сервера все эти 300 раз отлавливаются, но в данных при readAll одно и тоже #include "clientwc.h" static ClientWc *pInstance = 0; ClientWc::ClientWc(QObject *parent): QObject(parent), config(new Utils::Config::ConfigFile("../../config/client.ini")) {}
ClientWc *ClientWc::getInstance() { if(!pInstance) pInstance = new ClientWc(); return pInstance; }
void ClientWc::writeSocket(const QByteArray &data) { _data = data; if(_sockets.find(_data)==_sockets.end()) { _sockets[_data] = new QTcpSocket(this); connect(_sockets[_data],SIGNAL(readyRead()),this,SLOT(onReadyRead()),Qt::DirectConnection); connect(_sockets[_data],SIGNAL(connected()),this,SLOT(onSockedSend()),Qt::DirectConnection); connect(_sockets[_data],SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(onHandlerError(QAbstractSocket::SocketError)),Qt::DirectConnection); connect(_sockets[_data],SIGNAL(disconnected()),_sockets[_data],SLOT(deleteLater())); _sockets[_data]->connectToHost( config->getOption<QString>("host"), config->getOption<QString>("port").toInt()); } }
void ClientWc::onHandlerError(QAbstractSocket::SocketError error) { LOGE()<<"Error handler socket with error"<<error;
QTcpSocket *tcpSocket = (QTcpSocket*)sender(); if(tcpSocket) { QByteArray key = _sockets.key(tcpSocket); tcpSocket->disconnectFromHost(); _sockets.remove(key); } }
void ClientWc::onReadyRead() { QTcpSocket *tcpSocket = (QTcpSocket*)sender(); if(!tcpSocket || !tcpSocket->isValid()) { LOGE()<<"Error read socket"; return ; } QByteArray clientDate = tcpSocket->readAll(); QByteArray key = _sockets.key(tcpSocket); tcpSocket->disconnectFromHost(); _sockets.remove(key); emit received(clientDate); }
void ClientWc::onSockedSend() { QTcpSocket *tcpSocket = (QTcpSocket*)sender(); if(!tcpSocket || !tcpSocket->isValid()) { LOGE()<<"Error write socket"; return ; }
if(-1==tcpSocket->write(_data)) { LOGE()<<"Error write data in socket"; } }
ClientWc::~ClientWc() { if(_sockets.size()) { for(QMap<QByteArray,QTcpSocket *>::iterator it = _sockets.begin(); it!=_sockets.end(); ++it) { it.value()->disconnectFromHost(); } _sockets.clear(); } } на стороне сервера так : void ServerWc::incomingConnection() { while(_serv->hasPendingConnections()) { QTcpSocket *socket = _serv->nextPendingConnection(); LOGI()<<(void*)socket; if(socket && socket->isValid()) { connect(socket,SIGNAL(readyRead()),this,SLOT(readyRead())); connect(socket,SIGNAL(disconnected()),socket,SLOT(deleteLater())); } } } void ServerWc::readyRead(){ QObject * object = QObject::sender(); if( !object ) return ;
QTcpSocket *socket = static_cast<QTcpSocket *>(object); if(!socket || !socket->isValid()) { LOGE()<<"Error get socket"; return ; }
QByteArray clientDate = socket->readAll(); ClientHandler *handler = new ClientHandler(clientDate,socket,this); connect(handler,SIGNAL(handlerComplete(QTcpSocket*,QByteArray)),this,SLOT(writeSocket(QTcpSocket*,QByteArray))); handler->run(); }
Название: Re: Опять сокеты
Отправлено: BuRn от Февраль 20, 2015, 00:06
Логическая ошибка. Проблема решена
|