Russian Qt Forum
Ноябрь 23, 2024, 00:07 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Опять сокеты  (Прочитано 2386 раз)
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();
}
« Последнее редактирование: Февраль 19, 2015, 23:33 от BuRn » Записан
BuRn
Гость
« Ответ #1 : Февраль 20, 2015, 00:06 »

Логическая ошибка. Проблема решена
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.046 секунд. Запросов: 20.