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); }
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){} }