Seite 1 von 1

TcpServer

Verfasst: 26. August 2010 22:13
von Irods
Hi Leute.
Ich wollte mal Tcp mit Qt ausprobieren, allerdings fange ich jetzt an langsam
gar nichts mehr zu verstehen.

Also ich habe einen Client geschrieben, und einen Server .... hier der Code.

Der Server:

Code: Alles auswählen

#ifndef MYPROCESS_H
#define MYPROCESS_H
#include <QtGui>
#include <QTcpServer>
#include <QTcpSocket>
#include <QHostAddress>

class MyProcess : public QMainWindow
{
	Q_OBJECT
	public:
		MyProcess(QMainWindow *parent = 0);
	private:
		QTcpServer *tcpServer;
		QTcpSocket *clientConnection;

		QByteArray block;
		QDataStream *out;

	private slots:
		void connection();
};
#endif

Code: Alles auswählen

#include "MyProcess.h"

MyProcess::MyProcess(QMainWindow *parent) : QMainWindow(parent)
{
	out = new QDataStream(&block, QIODevice::WriteOnly);
	out->setVersion(QDataStream::Qt_4_0);

	tcpServer = new QTcpServer(this);
	tcpServer->listen(QHostAddress::Any, 3745);
	connect(tcpServer, SIGNAL(newConnection()), this, SLOT(connection()));
}

void MyProcess::connection()
{
	clientConnection = tcpServer->nextPendingConnection();

	*out << QString("blablabla");
	clientConnection->write(block);
	*out << QString("tuuuut");
	clientConnection->write(block);

	clientConnection->disconnectFromHost();
}
Hier der Client:

Code: Alles auswählen

#ifndef MYCLIENT_H
#define MYCLIENT_H
#include <QtGui>
#include <QTcpServer>
#include <QTcpSocket>

class MyClient : public QMainWindow
{
	Q_OBJECT
	public:
		MyClient(QMainWindow *parent = 0);
	private:
		QTcpSocket* tcpSocket;
	private slots:
		void incomming();
};
#endif

Code: Alles auswählen

#include "MyClient.h"

MyClient::MyClient(QMainWindow *parent) : QMainWindow(parent)
{
	tcpSocket = new QTcpSocket;
	tcpSocket->connectToHost("localhost", 3745);
	connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(incomming()));
}

void MyClient::incomming()
{
	QDataStream in(tcpSocket);
	in.setVersion(QDataStream::Qt_4_0);

	QString line;
	in>>line;

	QMessageBox msgBox;
	msgBox.setText(line);
	msgBox.exec();
}
Also wenn ich den Code ausführe bekomme ich zwar das "blablabla",
allerdings nicht das "tuuuut".
Was mache ich falsch?

Schon mal danke.
Gruss Irods.

Verfasst: 27. August 2010 07:46
von Christian81
Möglicherweise schliesst Du die Verbindung zu schnell. Ich würde mal auf QIODevice::bytesWritten() oder ähnliches warten.

Verfasst: 27. August 2010 13:32
von Irods
Christian81 hat geschrieben:Möglicherweise schliesst Du die Verbindung zu schnell. Ich würde mal auf QIODevice::bytesWritten() oder ähnliches warten.
Hey, danke für die Antwort.
Ich hab jetzt mal

Code: Alles auswählen

clientConnection->disconnectFromHost();
aus kommentiert, trotzdem das gleiche Problem.

Verfasst: 27. August 2010 14:47
von RHBaum
Dein problem hat weniger was mit dem TCP zu tun, eher mit dem verstaendniss von Datenstroemen im bin/textmode.

QDataStream operator << (const QString & s) ist extern definiert und macht folgendes :
QString
If the string is null: 0xFFFFFFFF (quint32)
Otherwise: The string length in bytes (quint32) followed by the data in UTF-16
Das heisst schreibst du einen String in einen Datenstrom, holst du auch nur mit QDataStream operator >> (QString & s) auch den nur wieder raus. der Datenstrom trennt also die strings intern (in dem er sich ihre laenge merkt).

Du wirst definitiv ne ende kennung mitsenden muessen, weil nen Datenstrom auf TCP basis kein eof unterstuetzen duerfte ...

dann kannst sowas machen
QString line;
while(line != EndeKennung)
{
in>>line;
QMessageBox::information(NULL,"Title",line);
}

Ciao ...

Verfasst: 27. August 2010 15:29
von Irods
Hey cool danke.
So funktionierst es ... werde mir wohl noch mal DataStreams angucken müssen.
Gruss Irods