Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

[Tut]Qt Creator - Serwer TCP


Rekomendowane odpowiedzi

Weteran
Opublikowano

Witam ponownie,

w tym dość krótkim tutorialu napiszę jak zrobić serwer TCP w Qt z użyciem Qt Creator.

Na wstępnie chciałbym powiedzieć czym się różnią te tutoriale od reszty dostępnych w internecie. Przede wszystkim są głównie nastawione na korzystanie z pakietu narzędzi Qt Creator, w innych kursach jeżeli coś pojawi się na ten temat, zazwyczaj jest to w formie krótkiej notatki informującej jedynie o jego istnieniu.

 

A więc jak już wspomniałem na początku, naszym celem jest stworzenie programu, który będzie obsługiwał połączenie TCP.

Czym jest TCP? Żebym bez potrzeby nie musiał kopiować informacje z wikipedia, po prostu podam link do zagadnienia, które będzie nam potrzebne http://pl.wikipedia....ontrol_Protocol.

Po przeczytaniu jak już wiecie, TCP to połączenie klient<-->serwer, z tym że klient i serwer muszą siebie na wzajem ciągle zapewniać że połączenie nadal trwa, jeśli tego nie zrobią, połączenie zostanie przerwane. Więc bierzmy się za kodzenie....

Projektowanie

Projektowanie nie będzie zbyt skomplikowane, po prostu wstawmy widżet o nazwie TextBrowser i na głównym oknie użyjmy ctrl + G, jeżeli nie wiesz jak zrobić te czynności, to znaczy że nie przeczytałeś poprzedniego tutoriala - Wstępu do Qt Creator. Natomiast Całość powinna wyglądać tak:

okienkotcp.jpg

Programowanie

Teraz przejdźmy do programowania właściwego(cholera, nie wiem czy właśnie nie wymyśliłem nowego pojęcia), wszystkie szablony tworzymy w taki sam sposób jak w poprzednim poradniku.

Następnie "includujemy" dwie klasy w pliku nagłówkowym klasy głównej naszego programu(domyślnie mainwindow.h):

#include <QTcpServer>
#include <QTcpSocket>

 

Potem dodajemy następujące deklaracje:

QTcpServer *server;
QTcpSocket *socket;

 

 

 

Oraz jeden slot publiczny:

void lacz();

 

Ostatecznie całość powinna wyglądać tak:

 

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTcpServer>
#include <QTcpSocket>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();

private:
Ui::MainWindow *ui;
QTcpServer *server;
QTcpSocket *socket;

public slots:
void lacz();

};

#endif // MAINWINDOW_H

 

Do konstruktora klasy głównej w pliku .cpp, domyślnie mainwindow.cpp, umieszczamy definicje obiektu server:

server = new QTcpServer(this);

 

Potem wywołujemy metodę listen znowu na obiekcie server:

server->listen(QHostAddress::Any, 666);

Słówko o tej funkcji:

Jak sama nazwa wskazuję wywołuje ona nasłuchiwanie servera, czyli jakby otwarcie bramy dzięki czemu inni będą mogli się z nami połączyć, jako pierwszy parametr przyjmuję dla kogo ma ta "brama" się otworzyć w naszym wypadku otwiera się dla wszystkich(to nawet lepiej niż brama raju ;o), a jako drugi wartość portu, w naszym wypadku jest to 666(tak, wiem, jestem bestialski).

 

Na końcu dodajemy jeszcze połączenie(connect()) między obiektem server a slotem lacz():

connect(server,SIGNAL(newConnection()),this,SLOT(lacz()));

Obiekt server wysyła sygnał newConnection(), tylko wtedy, kiedy zostanie utworzone nowe połączenie(czyli jakiś klient zechce się z nami połączyć)

Tymczasem zostawmy już konstruktor w spokoju i przejdźmy do naszego funkcjo-slotu klasy MainWindow, będzie ona wyglądać tak:

 

 

void MainWindow::lacz()
{
 socket = new QTcpSocket(this);
 socket = server->nextPendingConnection();
 ui->textBrowser->setText("New Connection!");
 socket->write("Hi, Client!");
}

Po zdefiniowaniu obiektu socket dajemy mu adres ip klienta który próbuję się z nami połączyć(pamiętaj że funkcja lacz() zostanie wykonana, gdy ktoś będzie z nami próbować połączyć, więc adres ip jest już znany). Robimy to poprzez wywołanie metody nextPendingConnection() na obiekcie server, następnie tą wartość którą zwróci nam serwer przypisujemy do obiektu socket. Właściwie już nawiązaliśmy połączenie, teraz wystarczy poinformować nas o tym że takowe połączenie się odbywa oraz wysyłamy przyjazną wiadomość dla client na powitanie, przez metodą write.

Całość pliku z naszą główna klasą powinna ostatecznie wyglądać tak:

 

#include "mainwindow.h"
#include "ui_mainwindow.h"


MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
server = new QTcpServer(this);

server->listen(QHostAddress::Any, 666);
connect(server,SIGNAL(newConnection()),this,SLOT(lacz()));

}

MainWindow::~MainWindow()
{
delete ui;
}

void MainWindow::lacz()
{
 socket = new QTcpSocket(this);
 socket = server->nextPendingConnection();
 ui->textBrowser->setText("Hello Server!");
 socket->write("Hi, Client!");
}

 

Na końcu dodajemy jeszcze do pliku konfiguracyjnego(to ten z końcówką .pro) następującą linijkę:

 

QT += network

 

Dodaje ona do naszego projektu wszystkie potrzebne klasy do połączenia TCP. Pamiętajmy, że przez to przy publikowaniu naszego programu będziemy musieli dodać jeszcze jeden plik .dll

 

@Edit:

Bym jeszcze zapomniał jak najłatwiej można połączyć się z naszym serwerem:

1. Otwieramy cmd - uruchom -> cmd

2. W cmd wpisujemy telnet

3. W telnet wpisujemy open 127.0.0.1 666

Opublikowano

Dzięki, że ponowiłeś :)

Temat był już na 20 stronie i nikt go nie widział. Teraz na pewno wzrośnie zainteresowanie tutorialem i przybędzie mnóstwo chwalebnych komentarzy od spragnionych wiedzy czytelników :)

mjut.png
Weteran
Opublikowano

Dzięki, że ponowiłeś :)

Temat był już na 20 stronie i nikt go nie widział. Teraz na pewno wzrośnie zainteresowanie tutorialem i przybędzie pełno komentarzy od spragnionych wiedzy czytelników :)

Oj tam, Oj tam...

Bardziej dziwne jest to, że jakiś głupi spambot napisany w windows forms ma większe zainteresowanie od poradnika dot. połączenia TCP w Qt napisanego oop, ale co tam...

  • 2 miesiące temu...
Opublikowano

Xaulin ucząc sie z twoich tutków czekam na kolejne wersje :) Lecz niestety zawiodłeś mnie. Napisałes w 1 Tucie ze nie bedzie kontynuacji.... ;/ źlee

hcq0.png


  • 2 tygodnie później...
Opublikowano

Tak sobie myślę, że warto byłoby dodać kilka rzeczy tak w imię poprawności kodu.

 

1. Sprawdzić czy serwer nasłuchuje.

2. Sprawdzić czy write() coś wysłało do strumienia.

3. Wywołać flush() coby na pewno wszystko poszło w strumień.

4. Zamknąć połączenie coby bez sensu nie wisiało.

linki zewn.

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...