Пример #1
0
void PollsServer::incomingConnection(int handle)
{
    //создаем клиента
    PollsClient *client = new PollsClient(handle, this);
    if (_dialog != 0)
    {
        connect(client, SIGNAL(addUserToGui(QString)), _dialog, SLOT(onAddUserToGui(QString)));
        connect(client, SIGNAL(removeUserFromGui(QString)), _dialog, SLOT(onRemoveUserFromGui(QString)));
        connect(client, SIGNAL(doVoteUp(QString,QString,QString,QString)), _dialog, SLOT(onVoteUp(QString,QString,QString,QString)));
    }
    connect(client, SIGNAL(removeUser(PollsClient*)), this, SLOT(onRemoveUser(PollsClient*)));
    _clients.append(client);
}
Пример #2
0
void MyClient::onReadyRead()
{
    QDataStream in(_sok);
    //если считываем новый блок первые 2 байта это его размер
    if (_blockSize == 0) {
        //если пришло меньше 2 байт ждем пока будет 2 байта
        if (_sok->bytesAvailable() < (int)sizeof(quint16))
            return;
        //считываем размер (2 байта)
        in >> _blockSize;
        qDebug() << "_blockSize now " << _blockSize;
    }
    //ждем пока блок прийдет полностью
    if (_sok->bytesAvailable() < _blockSize)
        return;
    else
        //можно принимать новый блок
        _blockSize = 0;
    //3 байт - команда серверу
    quint8 command;
    in >> command;
    qDebug() << "Received command " << command;
    //для неавторизованный пользователей принимается только команда "запрос на авторизацию"
    if (!_isAutched && command != comAutchReq)
        return;

    switch(command)
    {
        //запрос на авторизацию
        case comAutchReq:
        {
            //считываем имя
            QString name;
            in >> name;
            //проверяем его
            if (!_serv->isNameValid(name))
            {
                //отправляем ошибку
                doSendCommand(comErrNameInvalid);
                return;
            }
            //проверяем не используется ли имя
            if (_serv->isNameUsed(name))
            {
                //отправляем ошибку
                doSendCommand(comErrNameUsed);
                return;
            }
            //авторизация пройдена
            _name = name;
            _isAutched = true;
            //отправляем новому клиенту список активных пользователей
            doSendUsersOnline();
            //добавляем в интерфейс
            emit addUserToGui(name);
            //сообщаем всем про нового ползователя
            _serv->doSendToAllUserJoin(_name);
        }
        break;
        //от текущего пользователя пришло сообщение для всех
        case comMessageToAll:
        {
            QString message;
            in >> message;
            //отправляем его всем
            _serv->doSendToAllMessage(message, _name);
            //обновляем лог событий
            emit messageToGui(message, _name, QStringList());
        }
        break;
        //от текущего пользователя пришло сообщение для некоторых пользователей
        case comMessageToUsers:
        {
            QString users_in;
            in >> users_in;
            QString message;
            in >> message;
            //разбиваем строку на имена
            QStringList users = users_in.split(",");
            //отправляем нужным
            _serv->doSendMessageToUsers(message, users, _name);
            //обновляем интерфейс
            emit messageToGui(message, _name, users);
        }
        break;
    }

    //for (long long i = 0; i < 4000000000; ++i){}
}