рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд░реНрд╡рд░ рдЪреИрдЯ Qt / C ++ рд╕реЙрдХреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░

рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛


рд▓реЗрдЦ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рд╢реБрд░реБрдЖрддреА рдХреЗ рд▓рд┐рдП рд▓рдХреНрд╖рд┐рдд рд╣реИред рдЗрд╕рдХреЗ рд▓реЗрдЦрди рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдиреЗрдЯрд╡рд░реНрдХ рдХреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕рдордЭ рдФрд░ рд╕реЙрдХреЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рд╕реЙрдХреЗрдЯреНрд╕ рдХрд╛ рддреНрд╡рд░рд┐рдд рдФрд░ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рд╣реИред рдПрдХ рд╕рдордп рдореИрдВ рдПрдХ рд╕рдорд╛рди рдПрдХ рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рдерд╛, рд▓реЗрдХрд┐рди рд╡рд┐рд╕реНрддреГрдд рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рдорд╛рдирдХ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдХреНрдпреВрдЯреА рдХреЗ рд╕рд╛рде рдЖрдиреЗ рд╡рд╛рд▓рд╛ рднрд╛рдЧреНрдп рд╕рд░реНрд╡рд░ / рдХреНрд▓рд╛рдЗрдВрдЯ рдмрд╣реБрдд рдЦрд░рд╛рдм рд╕реЙрдХреЗрдЯ рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред

рддреЛ, рд╕рд░реНрд╡рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдЕрдиреБрд░реЛрдз рдкреНрд░рд╕реНрддреБрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдпреЗ Gooey рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реЛрдВрдЧреЗ:

рдЫрд╡рд┐

Qt рдореЗрдВ, рд╕реЙрдХреЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП qtcpSocket рдФрд░ QTcpServer рдХреНрд▓рд╛рд╕реЗрд╕ рд╣реИрдВред рд╕рдВрдХреЗрддреЛрдВ рдФрд░ рд╕реНрд▓реЙрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдЙрдирдХреЗ рд╕рд╛рде рдЧреИрд░-рдЕрд╡рд░реЛрдзрдХ (рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдореЛрдб) рдореЗрдВ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрджрд┐ рд╕рд░реНрд╡рд░ рд╕реЗ рдХрдиреЗрдХреНрд╢рди рдХреЛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдорд╛рддреНрд░рд╛ рдореЗрдВ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ, рддреЛ gui рдмреНрд▓реЙрдХ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реИ, рдФрд░ рдЬрдм рдХрдиреЗрдХреНрд╢рди (рдпрд╛ рддреНрд░реБрдЯрд┐) рд╣реЛрддреА рд╣реИ, рддреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реНрд▓реЙрдЯ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рд╡рд░реНрддрдорд╛рди рдорд╛рдорд▓реЗ рдореЗрдВ, рдХрдиреЗрдХреНрдЯреЗрдб () рд╕рд┐рдЧреНрдирд▓ рд╕реЗ рдЬреБрдбрд╝рд╛)ред

рдЧреНрд░рд╛рд╣рдХ


рдЪрд▓реЛ рдПрдХ рд╕рд░рд▓ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ - рд╣рдо рдХрдХреНрд╖рд╛рдПрдВ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдирд╣реАрдВ рд▓реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдХреНрдпреВрдЯреАрдкреАрд╕реА рд╕реЙрдХреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
//dialog.h class Dialog : public QDialog { private slots: //      void onSokConnected(); void onSokDisconnected(); // readyRead ,     (      )  void onSokReadyRead(); void onSokDisplayError(QAbstractSocket::SocketError socketError); private: QTcpSocket *_sok; // quint16 _blockSize;//    QString _name;//  }; 
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЬрдм рд╕реЙрдХреЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдбреЗрдЯрд╛ рдХреЛ рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрдирд╛ рд╣реЛрдЧрд╛, рдЕрдиреНрдпрдерд╛ рдХреЗрд╡рд▓ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ (рдПрдХ рдкреВрд░реНрдг рд╕рдВрджреЗрд╢ рдирд╣реАрдВ рдЖрдпрд╛ рд╣реИ, рдФрд░ рдЕрдЧрд▓рд╛ рдкрд┐рдЫрд▓реЗ рдПрдХ рдЯреБрдХрдбрд╝реЗ рдХреЗ рд╕рд╛рде рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред рдЗрди рдкрд░реЗрд╢рд╛рдирд┐рдпреЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо (QDataStream) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдФрд░ рд╕реЙрдХреЗрдЯреНрд╕ рдХреЗ рдмреАрдЪ рдмреНрд▓реЙрдХ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд░реЗрдВрдЧреЗ рдЬрд┐рд╕рдореЗрдВ рдкрд╣рд▓реЗ 2 рдмрд╛рдЗрдЯреНрд╕ рд╡рд░реНрддрдорд╛рди рдмреНрд▓реЙрдХ рдХрд╛ рдЖрдХрд╛рд░ рд╣реИ, рддреАрд╕рд░рд╛ рдмрд╛рдЗрдЯ рд╕рд░реНрд╡рд░ (рдпрд╛ рд╕рд░реНрд╡рд░ рд░рд┐рд╕реНрдкрд╛рдВрд╕) рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╛рдЗрдВрдЯ рдХрдорд╛рдВрдб рд╣реИ, рдФрд░ рдмрд╛рдХреА рдХрдорд╛рдВрдб рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдбреЗрдЯрд╛ рд╣реИред рдпрд╣ рдХрд╣рдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдЯреАрд╕реАрдкреА рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕рднреА рдкреИрдХреЗрдЯреЛрдВ рдХреЗ рд╡рд┐рддрд░рдг рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЗрд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреНрд▓реЙрдХ рдХреЗ рдкреВрд░реНрдг рдЖрдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

 //dialog.cpp Dialog::Dialog(QWidget *parent) :QDialog(parent),ui(new Ui::Dialog) { //  _sok = new QTcpSocket(this); //  connect(_sok, SIGNAL(readyRead()), this, SLOT(onSokReadyRead())); connect(_sok, SIGNAL(connected()), this, SLOT(onSokConnected())); connect(_sok, SIGNAL(disconnected()), this, SLOT(onSokDisconnected())); connect(_sok, SIGNAL(error(QAbstractSocket::SocketError)),this, SLOT(onSokDisplayError(QAbstractSocket::SocketError))); } //     , ,  connectToHost()   void, ,            onSokDisplayError void Dialog::on_pbConnect_clicked() { _sok->connectToHost(ui->leHost->text(), ui->sbPort->value()); } void Dialog::onSokConnected() { //       QByteArray block; QDataStream out(&block, QIODevice::WriteOnly); // 2    .  MyClient    ,        -   //  -  out << (quint16)0 << (quint8)MyClient::comAutchReq << ui->leName->text(); _name = ui->leName->text(); //   out.device()->seek(0); //      out << (quint16)(block.size() - sizeof(quint16)); _sok->write(block); } void Dialog::onSokReadyRead() { //     QDataStream in(_sok); //     2     if (_blockSize == 0) { //   2     2  if (_sok->bytesAvailable() < (int)sizeof(quint16)) return; //  (2 ) in >> _blockSize; } //     if (_sok->bytesAvailable() < _blockSize) return; else //    _blockSize = 0; //3  -   quint8 command; in >> command; switch (command) { //   ,   ,        MyClient::comUsersOnline case MyClient::comUsersOnline: { QString users; in >> users; if (users == "") return; //    ,   (       QStringList) QStringList l = users.split(","); //  ui->lwUsers->addItems(l); } break; //    case MyClient::comPublicServerMessage: { //     QString message; in >> message; AddToLog("[PublicServerMessage]: "+message, Qt::red); } ... } } 
рдпрд╣ рд╕рдм рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд╕рд╛рде рд╣реИ - рдореБрдЦреНрдп рдмрд┐рдВрджреБрдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдмрд╛рдХреА рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред

рд╕рд░реНрд╡рд░


рд╕рд░реНрд╡рд░ рдореЗрдВ рд╕рдм рдХреБрдЫ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛрдЧрд╛ - рд╣рдо рдЧреБрдИ (рдбрд╛рдпрд▓реЙрдЧ), рд╕рд░реНрд╡рд░ (рдорд╛рдИрд╕реНрд╡рд░) рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ (рдорд╛рдпрдХреНрд▓рд┐рдпрд░) рдХреЛ рдЕрд▓рдЧ рдХрд░ рджреЗрдВрдЧреЗред рдЬреЛ рд╕реЙрдХреЗрдЯреНрд╕ рд╕реЗ рдЕрдкрд░рд┐рдЪрд┐рдд рд╣реИ рд╡рд╣ рдпрд╣ рдирд╣реАрдВ рд╕рдордЭ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд┐рд╕ рд╕рд░реНрд╡рд░ рдореЗрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? рдЗрд╕рд▓рд┐рдП, рд╕реЙрдХреЗрдЯ рдХреЛ рд╕рд░реНрд╡рд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╕рдордп, рд╕рд░реНрд╡рд░ рдкрд░, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдПрдХ "рдХреНрд▓рд╛рдЗрдВрдЯ" рд╕реЙрдХреЗрдЯ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╕рд░рдгреА рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ (рд╡рд┐рдЪрд╛рд░ рдПрдХ рд╕рд╛рд╣рдЪрд░реНрдп рд╕рд░рдгреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП рд╣рдо QList рд▓реЗ рд▓реЗрдВрдЧреЗ)ред

 //dialog.cpp Dialog::Dialog(QWidget *parent) :QDialog(parent), ui(new Ui::Dialog) { // .    - parent,  -     ,     myclient   _serv = new MyServer(this, this); //      connect(this, SIGNAL(messageFromGui(QString,QStringList)), _serv, SLOT(onMessageFromGui(QString,QStringList))); ... //     127.0.0.1:1234 if (_serv->doStartServer(QHostAddress::LocalHost, 1234)) {...} else {...} } 


рд╣рдо qtcpServer рд╕реЗ рд╡рд░реНрдЧ рд╡рд╛рд░рд┐рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рд╡рд░реНрдЪреБрдЕрд▓ рдлрд╝рдВрдХреНрд╢рди рдЗрдирдХрдорд┐рдВрдЧ рдХреЙрдирдХрдиреЗрдХреНрд╢рди рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдХрдиреЗрдХреНрд╢рди рдХреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдЗрдирдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЙрдХреЗрдЯ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рд╣реИ)

 //myserver.h class MyServer : public QTcpServer { public: bool doStartServer(QHostAddress addr, qint16 port); void doSendToAllUserJoin(QString name); //    void doSendToAllUserLeft(QString name); void doSendToAllMessage(QString message, QString fromUsername); //  void doSendToAllServerMessage(QString message);//  void doSendServerMessageToUsers(QString message, const QStringList &users); //   void doSendMessageToUsers(QString message, const QStringList &users, QString fromUsername); QStringList getUsersOnline() const; //   bool isNameValid(QString name) const; //  bool isNameUsed(QString name) const; //    protected: void incomingConnection(int handle); private: QList<MyClient *> _clients; //  QWidget *_widget; //         myclient }; //myserver.cpp void MyServer::incomingConnection(int handle) { //  ,    (   ),    - parent MyClient *client = new MyClient(handle, this, this); //    ,       if (_widget != 0) { connect(client, SIGNAL(addUserToGui(QString)), _widget, SLOT(onAddUserToGui(QString))); connect(client, SIGNAL(removeUserFromGui(QString)), _widget, SLOT(onRemoveUserFromGui(QString))); ... } _clients.append(client); } /*           ,    _clients, ,    */ void MyServer::doSendServerMessageToUsers(QString message, const QStringList &users) { //    QByteArray block; QDataStream out(&block, QIODevice::WriteOnly); out << (quint16)0 << MyClient::comPrivateServerMessage << message; out.device()->seek(0); out << (quint16)(block.size() - sizeof(quint16)); //   (  ,     users  ) for (int j = 0; j < _clients.length(); ++j) if (users.contains(_clients.at(j)->getName())) _clients.at(j)->_sok->write(block); } 


рдЧреНрд░рд╛рд╣рдХ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП, рд╢рд╛рдпрдж рдпрд╣ рдХреЗрд╡рд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рдпрд╣рд╛рдБ рд╕рдм рдХреБрдЫ рд╕рд╛рджреГрд╢реНрдп рджреНрд╡рд╛рд░рд╛ рд╕реНрдкрд╖реНрдЯ рд╣реИред MyClient рдХреЛ QTcpSocket рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕реЗ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 //myclient.h class MyClient : public QObject { //   MyServer    _sok friend class MyServer; public: static const QString constNameUnknown; static const quint8 comAutchReq = 1; static const quint8 comUsersOnline = 2; ... static const quint8 comErrNameUsed = 202; void setName(QString name) {_name = name;} QString getName() const {return _name;} bool getAutched() const {return _isAutched;} void doSendCommand(quint8 comm) const; void doSendUsersOnline() const; signals: //    void addUserToGui(QString name); void removeUserFromGui(QString name); void messageToGui(QString message, QString from, const QStringList &users); //    QList void removeUser(MyClient *client); //      private slots: void onConnect(); void onDisconnect(); void onReadyRead(); void onError(QAbstractSocket::SocketError socketError) const; private: QTcpSocket *_sok; // MyServer *_serv; //   quint16 _blockSize; //   QString _name; // bool _isAutched; //  }; 


рдЕрдкрдбреЗрдЯ 2017 :
рдХрд╛рд╢, рд╕реНрд░реЛрдд рдХреЛрдб рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рдЦреЛ рдЬрд╛рддрд╛ рд╣реИ
рдЕрдкрдбреЗрдЯ 2018 :
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рдЬреЛ рдХреБрдЫ рднреА рдХрднреА рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдЕрдкрд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╡рд╣ рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд░рд╣рддрд╛ рд╣реИред Vladpower рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдлрд┐рд░ рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ

Source: https://habr.com/ru/post/In131585/


All Articles