Evgenii Legotckoi
Evgenii Legotckoi8. Dezember 2015 10:20

Qt/C++ - Lektion 034. Echo Server basierend auf QTcpServer

Für die Arbeit mit dem TCP/IP -Stack bietet Qt die Klassen QTcpServer, QTcpSocket, und QUdpSocket. Für eine erste Bekanntschaft mit der Arbeit eines lokalen Netzwerks schreiben wir Echo Server . Die Aufgabe des Echoservers besteht darin, die von ihm empfangenen Daten wie ein Echo bei einer menschlichen Stimme an den Sender zurückzusenden. Telnet wird verwendet, um eine Verbindung zum Server herzustellen.

> TELNET (engl. TERMINAL NETwork) - ein Netzwerkprotokoll zur Implementierung einer Textschnittstelle über ein Netzwerk (in moderner Form - unter Verwendung des TCP-Transports) Der Name "telnet" hat auch einige Dienstprogramme, die die Clientseite des Protokolls implementieren.
>
>

Im vorgeschlagenen Programm lauscht ein Objekt der Klasse QTcpServer auf einen der Ports des TCP / IP Protokollstapels von allen Hosts im Netzwerk. Die Überwachung eines Ports wird mit der Methode listen() eingestellt, wobei die angegebene IP-Adresse oder der IP-Adressbereich und der Überwachungsport angegeben werden.

Wenn sich der Client mit dem Port verbindet, wird das newConnection () Signal aufgerufen, das mit dem Slot SlotNewConnection () verbunden wird, in diesem Slot wird die Client-Verbindung als QTcpSocket initiiert Objekt auf der Serverseite mit der Methode nextPendingConnection(), die einen Zeiger auf das QTcpSocket zurückgibt.

Zwei Steckplätze werden mit der neuen Buchse verbunden. Der erste Slot, slotServerRead () , wird mit dem readyRead-Signal vom Socket verbunden und aufgerufen, wenn der Socket Daten empfängt, die zum Lesen bereit sind. Der zweite Slot slotClientDisconnected () ist mit dem Disconnected () Signal verbunden, das aufgerufen wird, wenn der Client sich vom Server trennt und die Verbindung von der Serverseite her beenden muss.

Projektstruktur für die Arbeit mit QTcpServer

Es wird eine Konsolenanwendung erstellt, daher werden Klassen wie MainWindow in der Anwendung nicht verwendet.

  • EchoServer.pro - Projektprofil;
  • main.cpp - Hauptquellcodedatei;
  • mytcpserver.h - Server-Header-Datei;
  • mytcpserver.cpp - Quellcodedatei des Servers;

EchoServer.pro

In dieser Datei müssen Sie ein Qt -Modul hinzufügen, um mit dem Netzwerk zu arbeiten.

QT += network

main.cpp

Alles, was Sie in dieser Datei tun müssen, ist, die Server-Header-Datei aufzunehmen und eine Server-Instanz zu erstellen.

#include <QCoreApplication>
#include "mytcpserver.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    MyTcpServer server;

    return a.exec();
}

mytcpserver.h

Diese Klasse ist ein Wrapper für die Arbeit mit QTcpServer und geerbt von QObject für die Verwendung von Signalen und Slots .

#ifndef MYTCPSERVER_H
#define MYTCPSERVER_H

#include <QObject>
#include <QTcpServer>
#include <QTcpSocket>

class MyTcpServer : public QObject
{
    Q_OBJECT
public:
    explicit MyTcpServer(QObject *parent = 0);

public slots:
    void slotNewConnection();
    void slotServerRead();
    void slotClientDisconnected();

private:
    QTcpServer * mTcpServer;
    QTcpSocket * mTcpSocket;
};

#endif // MYTCPSERVER_H

mytcpserver.cpp

#include "mytcpserver.h"
#include <QDebug>
#include <QCoreApplication>

MyTcpServer::MyTcpServer(QObject *parent) : QObject(parent)
{
    mTcpServer = new QTcpServer(this);

    connect(mTcpServer, &QTcpServer::newConnection, this, &MyTcpServer::slotNewConnection);

    if(!mTcpServer->listen(QHostAddress::Any, 6000)){
        qDebug() << "server is not started";
    } else {
        qDebug() << "server is started";
    }
}

void MyTcpServer::slotNewConnection()
{
    mTcpSocket = mTcpServer->nextPendingConnection();

    mTcpSocket->write("Hello, World!!! I am echo server!\r\n");

    connect(mTcpSocket, &QTcpSocket::readyRead, this, &MyTcpServer::slotServerRead);
    connect(mTcpSocket, &QTcpSocket::disconnected, this, &MyTcpServer::slotClientDisconnected);
}

void MyTcpServer::slotServerRead()
{
    while(mTcpSocket->bytesAvailable()>0)
    {
        QByteArray array = mTcpSocket->readAll();

        mTcpSocket->write(array);
    }
}

void MyTcpServer::slotClientDisconnected()
{
    mTcpSocket->close();
}

Arbeiten mit Echo Server

Nachdem Sie das Projekt erstellt und Ihre Konsolenanwendung gestartet haben, verwenden Sie eine beliebige Software, die Telnet unterstützt, zum Beispiel Putty, und stellen Sie eine Verbindung zum konfigurierten Port her. Versuchen Sie, die Daten an den Server zu senden, um sicherzustellen, dass er sie an Sie zurückgibt. In einigen Fällen kann dies nicht passieren oder Sie können überhaupt keine Verbindung herstellen, dann deaktivieren Sie FireWall , oft ist das Problem darin versteckt.

Eine Demonstration der Anwendung mit zusätzlichen Kommentaren wird im Video-Tutorial präsentiert.

Link zum Download des Projekts in einem Zip-Archiv: echoserver.zip

Videoanleitung

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

ИВ
  • 15. März 2021 14:46
  • (bearbeitet)

Добрый день, разрешите вопрос:
во всех примерах работы с QTcpServer его всегда создают в main.cpp, нет ли возможности корректно сохдать его в MainWindow.cpp ?
Просто если перенести код в MainWindow.cpp

#include "myserver.h"

MainWindow::MainWindow( QWidget *parent): QMainWindow(parent) , ui(new Ui::MainWindow)
{
    myserver Server;
    Server.startServer();
    ui->setupUi(this);

то возникает ошибка на клиенте QNativeSocketEngine::write() was not called in QAbstractSocket::ConnectedState

Переменную myserver нужно объявить в заголовочном файле, в противном случае после выполнения конструктора окна эта переменная удаляется, поскольку создана на стеке конструктора.

ИВ
  • 2. Juli 2021 06:51

спасибо, но уже не актуально. Я уже написал классы многопоточного сервера и они переносимы, раскидал их по четырем приложениям, даже не меняя код.

e
  • 16. August 2021 12:43

Hi, great post.

If I were to reimplement QTcpServer for the purposes of SSL, shouldn't incomingConnection(int socket) just be automatically called after a connection occurs?

Kommentare

Nur autorisierte Benutzer können Kommentare posten.
Bitte Anmelden oder Registrieren
Letzte Kommentare
ИМ
Игорь Максимов5. Oktober 2024 07:51
Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55. Juli 2024 11:02
QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr8. Februar 2024 18:43
Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25. Dezember 2023 10:30
Boost - statisches Verknüpfen im CMake-Projekt unter Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
Jetzt im Forum diskutieren
J
JacobFib17. Oktober 2024 03:27
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
JW
Jhon Wick1. Oktober 2024 15:52
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
КГ
Кирилл Гусарев27. September 2024 09:09
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
F
Fynjy22. Juli 2024 04:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

Folgen Sie uns in sozialen Netzwerken