Qt 4 network module
-
Hi,
mein problem ist diesmal:
ich habe zwei programme, ein klient soll an einen server daten übertragen. dazu steht beim client:void serverCom::senden() { serververbindung->connectToHost("localhost",6000); stream = new QTextStream(serververbindung); (*stream) << 'x'; }
und bein server:
void clientCom::newCon() { QTextEdit* a = new QTextEdit(); QTcpSocket* s = nextPendingConnection(); stream = new QTextStream(s); char txt; if (! s) a->insertHtml("__"); (*stream) >> txt; a->insertHtml(&txt); a->show(); }
(clientCom erbt von QTcpServer)
das problem ist jetzt: es gibt keine fehlermeldungen, aber das 'x' kommt nicht an
-
Mach mal zwei ganz kleine Programme, die man selbst laufen lassen kann, und die das Problem zeigen. Poste diese vollständig, dass man keinen Aufwand treiben muss, um dein Problem zu sehen.
-
ok mach ich.
-
so ein kleines bsp, was net geht...
ich wäre daher sehr dankbar, wenn mir geholfen würdeKlient:
main.cpp#include <QApplication> #include <QTcpSocket> #include <QTextStream> int main(int argc, char* argv[]) { QApplication app(argc, argv); QTcpSocket* so = new QTcpSocket(); so->connectToHost("localhost", 6000); QTextStream* st = new QTextStream(so); (*st) << 'X'; return app.exec(); }
Server:
main.cpp#include <QApplication> #include "ser.h" int main(int argc, char* argv[]) { QApplication app(argc, argv); ser* se = new ser(); return app.exec(); }
ser.h
#ifndef SER_H #define SER_H #include <QTcpServer> class ser : public QTcpServer { Q_OBJECT public: ser(); virtual ~ser(); public slots: void nc(); }; #endif // SER_H
ser.cpp
#include "ser.h" #include <QTextEdit> #include <QTextStream> #include <QTcpSocket> #include <QHostAddress> ser::ser() { QObject::connect(this, SIGNAL(newConnection()), this, SLOT(nc())); listen(QHostAddress("localhost"), 6000); } ser::~ser() { //dtor } void ser::nc() { QTcpSocket* s = nextPendingConnection(); QTextStream* st; st = new QTextStream(s); QTextEdit* edt = new QTextEdit(); char ch; *st >> ch; edt->insertPlainText(&ch); edt->show(); }
-edit-
1. sry für doppelpost
2. wie dumm. der compilerfehler kommt natürlich davon, dass QTcpSocket gar nicht inkludiert wurde
-
Folgendes:
1. Das Wichtigste ist, dass du den Rückgabewert jeder Netzerkfunktion auswertest. Indem ich den Rückgabewert von deinem listen() ausgegeben habe, sah ich den ersten Fehler.
2. Wenn du nicht Signal/Slot basierte Netzwerkkommunikation machst, solltest du die waitFor... Funktionen kennen lernen.
3. Mit ethereal kannst du ganz gut dem Netzwerkverkehr lauschen und siehst, was tatsächlich über die Leitung geht.
4. Um Daten zu verschieben ist ein QDatastream eventuell besser.
Hier mal deine Client main.cpp:
#include <QApplication> #include <QTcpSocket> #include <QTextStream> #include <QDebug> int main(int argc, char* argv[]) { QApplication app(argc, argv); QTcpSocket so; so.connectToHost("localhost", 5000); if (not so.waitForConnected(10000)) { qDebug() << "Could not connect:" << so.errorString(); } { QTextStream st(&so); st << 'X'; } if (not so.waitForBytesWritten(10000)) { qDebug() << "Could not write:" << so.errorString(); } }
Und hier die ser.cpp des Servers:
#include <QTextEdit> #include <QTextStream> #include <QTcpSocket> #include <QHostAddress> #include <QDebug> #include "ser.h" ser::ser() { QObject::connect(this, SIGNAL(newConnection()), this, SLOT(nc())); if (not listen(QHostAddress::LocalHost, 5000)) { qDebug() << "Cannot listen: " << errorString(); } } ser::~ser() { //dtor } void ser::nc() { QTcpSocket* s = nextPendingConnection(); s->waitForReadyRead(); QTextStream st(s); QTextEdit * edt = new QTextEdit(); char ch = -1; st >> ch; edt->insertPlainText(&ch); edt->show(); }
-
Hey danke!
Ich bin gar nicht auf die idee gekommen, die rückgabewerte und fehlermeldungen auszuwerten...hätte ich mal besser gemachtauch danke für den tipp mit dem programm, sowas suchte ich schon länger.
eine frage noch, das is mir auf anhieb nicht klar geworden:
das zeichen wird jetz korrekt übertragen, aber woher kommen die zeichen danach?
und sind es immer gleich viele, wenn ja, könnte man sie wegschneiden?
-
piXelshooter schrieb:
Hey danke!
Ich bin gar nicht auf die idee gekommen, die rückgabewerte und fehlermeldungen auszuwerten...hätte ich mal besser gemachtauch danke für den tipp mit dem programm, sowas suchte ich schon länger.
eine frage noch, das is mir auf anhieb nicht klar geworden:
das zeichen wird jetz korrekt übertragen, aber woher kommen die zeichen danach?
und sind es immer gleich viele, wenn ja, könnte man sie wegschneiden?Bei mir ist es nur ein Zeichen. Es sollte auch nicht mehr übertragen werden.
Aber das ganze ist eher für QDataStream gedacht. Lies mal dazu die Doku.
-
wenn ich die nachrichten aus QStrings lese und wieder hinein schreibe geht es. So im nachinein wundert es mich, wie die zeichen in das textEdit kommen, denn in einem char ist doch net so viel platz, oder?
-edit-
btw, aus einem QTextString lässt sich eine komplette zeile (nicht nur bis zum " ") auch noch anders auslesen, als immer zu schreiben:
st >> ch;oder?