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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: клиент-сервер  (Прочитано 3940 раз)
sensey_molotok
Гость
« : Июнь 05, 2013, 20:26 »

Пишу программу "чат по локалке". Есть класс сервера:
class MyServer : public QDialog
{

    Q_OBJECT

private:
    QTcpServer* server;
    quint16     nextBlockSize;
    QMap<int, QTcpSocket *> users_list;
    QMap<int, QTcpSocket *>::iterator iter;

public:
    MyServer(int port, QDialog *parent = 0);
    void sendToAllClient(QTime time, QString name, QString mes);

private slots:
    void sl_NewConnection();
    void sl_ReadClient();
    void sl_onDestroy();

public slots:
    void sl_sendMessage(QString mes);

};

есть класс клиента:
class MyClient : public QDialog
{
    Q_OBJECT

public:
    MyClient(QHostAddress Host, int port, QDialog* parent = 0) ;
    QString getName();
    void setName(QString name);
    void on_Disconnect();

private slots:
    void sl_ReadyRead();
    void sl_Error(QAbstractSocket::SocketError);

private:
    QTcpSocket* tcpSocket;
    quint16     nextBlockSize;
    QString name;
};

В сервере есть функция подключения нового клиента:
void MyServer::sl_NewConnection()
{
    QTcpSocket * clientSocket = server->nextPendingConnection();
   
    connect(clientSocket, SIGNAL(disconnected()), clientSocket, SLOT(deleteLater()));
    connect(clientSocket, SIGNAL(readyRead()),this, SLOT(sl_ReadClient()));

    int idDescriptor = clientSocket->socketDescriptor();
    users_list[idDescriptor] = clientSocket;
}

как передать при подключении к серверу некий никнейм клиента, чтобы ассоциировать дескриптор клиента с его именем??? можно ли присвоить переменной tcpSocket из класса клиента это имя в некую скрытую переменную и потом в методу сервера изьять это имя?
Записан
mutineer
Гость
« Ответ #1 : Июнь 05, 2013, 20:44 »

Передай по открытому сокету имя
Записан
sensey_molotok
Гость
« Ответ #2 : Июнь 05, 2013, 20:45 »

Передай по открытому сокету имя
тоесть??
Записан
mutineer
Гость
« Ответ #3 : Июнь 05, 2013, 20:47 »

то есть tcpSocket->write(...), например
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



Просмотр профиля
« Ответ #4 : Июнь 05, 2013, 20:55 »

QTcpSocket наследник QObject, поэтому можно сколько угодно всего передавать вместе с объектом.
bool QObject::setProperty(const char * name, const QVariant & value)
QVariant QObject::property(const char * name) const
Записан
mutineer
Гость
« Ответ #5 : Июнь 05, 2013, 21:04 »

QTcpSocket наследник QObject, поэтому можно сколько угодно всего передавать вместе с объектом.
bool QObject::setProperty(const char * name, const QVariant & value)
QVariant QObject::property(const char * name) const


А каким образом это свойство должно попасть от клиента серверу?
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



Просмотр профиля
« Ответ #6 : Июнь 05, 2013, 21:07 »

А каким образом это свойство должно попасть от клиента серверу?
А надо от клиента серверу? Улыбающийся
Каюсь, я прочитал только это:
можно ли присвоить переменной tcpSocket из класса клиента это имя в некую скрытую переменную и потом в методу сервера изьять это имя?
Улыбающийся
Записан
mutineer
Гость
« Ответ #7 : Июнь 05, 2013, 21:08 »

А каким образом это свойство должно попасть от клиента серверу?
А надо от клиента серверу? Улыбающийся
Каюсь, я прочитал только это:
можно ли присвоить переменной tcpSocket из класса клиента это имя в некую скрытую переменную и потом в методу сервера изьять это имя?
Улыбающийся

Ну было как-то так:
Цитировать
как передать при подключении к серверу некий никнейм клиента, чтобы ассоциировать дескриптор клиента с его именем???
Улыбающийся
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #8 : Июнь 06, 2013, 09:21 »

все просто, создать собственный протокол или использовать существующие.
для текстового чата можно тупо текст слать, хотя это и не совсем хорошо, можете использовать json или xml например, или собвственный бинарный,тектостовый протокол.

в протоколе указать константы, которые отвечают за стадии регистрации, отправки, приема сообщения и т.п.

при приеме на сервере смотреть, какое значение этой переменной и делать соответствующие действия.

например как в json сделать.

при onConnected() клиента слать что то типа

Код:
{
action:"logon";
nikname:"some nikname";
}

А сервер, когда распарсит пакет json смотрит сначала на значение переменной action, смотрит что оно равно "logon", тогда извлекает nikname и присваивает нужной пременной.
Как то так... советую попробовать так для начала, тем более в 5м кутэ уже есть встренный парсер json нормальный (QScript не в счёт).
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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