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();
}
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");
}
Vielen Dank
Gruss Tectu