Seite 1 von 1

QTcpSocket: Client to Server

Verfasst: 23. März 2011 17:30
von Tectu
Guten Tag,

Ich habe mir einen einfachen TCP Server und TCP Client geschrieben. Der Client kann einen String vom Server anfordern, das funktioniert soweit gut.
Nun versuche ich dies so zu erweitern, dass auch der Client von sich aus zum Server einen String schicken kann. Hierbei kommte ich jedoch nicht weiter.

Mein Hauptproblem liegt darin, dass ich nicht weiss, ob ich den QTcpSocket den über nextPendingConncetion erstelle nur im Konstruktor brauche, oder nachher einen zweiten um die Daten zu empfangen?

Hier der Code des Clients:

Code: Alles auswählen

#include <QtGui>
#include <QtNetwork>
#include "client.h"
#include "ui_client.h"

Client::Client(QWidget *parent):QWidget(parent), ui(new Ui::Client)
{
    ui->setupUi(this);

    ui->textBrowser->clear();
    ui->hostLineEdit->setText("85.4.88.48");
    ui->portLineEdit->setText("1337");
    ui->portLineEdit->setValidator(new QIntValidator( 1, 65535, this ));

    tcpSocket = new QTcpSocket(this);

    connect(ui->recButton, SIGNAL(clicked()), this, SLOT(requestData()));
    connect(ui->sendButton, SIGNAL(clicked()), this, SLOT(sendData()));
    connect(ui->quitButton, SIGNAL(clicked()), this, SLOT(close()));
    connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(readData()));
}

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

void Client::requestData()
{
    blockSize = 0;
    // Falls in Verwendung, Socket zurücksetzen
    tcpSocket->abort();

    tcpSocket->connectToHost(ui->hostLineEdit->text(), ui->portLineEdit->text().toInt());
}

void Client::readData()
{
    QDataStream in(tcpSocket);
    in.setVersion(QDataStream::Qt_4_6);
    if (blockSize == 0)
    {
        if (tcpSocket->bytesAvailable() < (int)sizeof(quint16))
            return;
        in >> blockSize;
    }

    if (tcpSocket->bytesAvailable() < blockSize)
        return;

    QString data;
    in >> data;

    ui->textBrowser->insertPlainText("<"+QTime::currentTime().toString()+"> "+data+"\n");
}

void Client::sendData()
{
    QByteArray block;
    QDataStream out(&block, QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_4_6);
    out << (quint16)0;

    QString data;
    data = "Client is here";
    out << data;
    out.device()->seek(0);
    out << (quint16)(block.size() - sizeof(quint16));

    tcpSocket->write(block);
    tcpSocket->disconnectFromHost();
}
Hier der Code des Servers:

Code: Alles auswählen

#include <QtGui>
#include <QtNetwork>
#include "server.h"
#include "ui_server.h"

Server::Server(QWidget *parent):QWidget(parent),ui(new Ui::Server)
{
    ui->setupUi(this);
    ui->textBrowser->clear();
    ui->sendLineEdit->clear();
    ui->quitButton->setAutoDefault(false);

    tcpServer = new QTcpServer(this);
    QTcpSocket *client = tcpServer->nextPendingConnection();

    if (!tcpServer->listen(QHostAddress::Any, 1337))
        qDebug() << "Unable to start server";

    connect(ui->quitButton, SIGNAL(clicked()),this, SLOT(close()));
    connect(tcpServer, SIGNAL(newConnection()), this, SLOT(sendData()));
    connect(client, SIGNAL(readyRead()), this, SLOT(readData()));
}

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

void Server::sendData()
{
   QByteArray block;
   QDataStream out(&block, QIODevice::WriteOnly);
   out.setVersion(QDataStream::Qt_4_6);
   out << (quint16)0;

   QString data;
   data = "Server is here";
   out << data;
   out.device()->seek(0);
   out << (quint16)(block.size() - sizeof(quint16));

   QTcpSocket *clientConnection = tcpServer->nextPendingConnection();
   connect(clientConnection, SIGNAL(disconnected()),clientConnection, SLOT(deleteLater()));

   clientConnection->write(block);
   clientConnection->disconnectFromHost();
}

void Server::readData()
{
    QTcpSocket *readConnection = tcpServer->nextPendingConnection();

    QDataStream in(readConnection);
    in.setVersion(QDataStream::Qt_4_6);
    if (blockSize == 0)
    {
        if (readConnection->bytesAvailable() < (int)sizeof(quint16))
            return;
        in >> blockSize;
    }

    if (readConnection->bytesAvailable() < blockSize)
        return;

    QString data;
    in >> data;

    ui->textBrowser->insertPlainText("<"+QTime::currentTime().toString()+"> "+data+"\n");
}
Könnt ihr mir da weiter helfen?

Vielen Dank
Gruss Tectu

Verfasst: 23. März 2011 20:44
von ScyllaIllciz
Sockets sind bidirektional. Das heisst mit dem erstellten Socket kannst du lesen und schreiben.

Verfasst: 28. März 2011 14:11
von Tectu
Vielen Dank, ScyllaIllciz!

Mit dieser Information konnte ich nun alles passend zum Laufen bringen.



Danke

Greez Tectu