TcpServer

Alles rund um die Programmierung mit Qt
Antworten
Irods
Beiträge: 53
Registriert: 24. Mai 2009 20:57
Kontaktdaten:

TcpServer

Beitrag 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.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Möglicherweise schliesst Du die Verbindung zu schnell. Ich würde mal auf QIODevice::bytesWritten() oder ähnliches warten.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Irods
Beiträge: 53
Registriert: 24. Mai 2009 20:57
Kontaktdaten:

Beitrag 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.
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag 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 ...
Irods
Beiträge: 53
Registriert: 24. Mai 2009 20:57
Kontaktdaten:

Beitrag von Irods »

Hey cool danke.
So funktionierst es ... werde mir wohl noch mal DataStreams angucken müssen.
Gruss Irods
Antworten