Ich bin dabei ein Programm zu schreiben, das Zeichenketten von einem Socket runterliest und diese zur Aktualisierung von Labels in meiner Gui-Klasse verwendet.
Der Server läuft in einem Thread, der Client kann sich zum Server connecten und Datenaustausch findet auch statt. Nur bekomme ich nicht die Zeichenkette, die der Testclient sendet, sondern nichts!
Hier der Client-Code:
Code: Alles auswählen
client.h
#include <QtNetwork>
#include <QObject>
#include <QString>
#include <QTcpSocket>
class Client: public QObject
{
Q_OBJECT
public:
Client(QObject* parent = 0);
~Client();
void start(QString address, quint16 port);
public slots:
void startTransfer();
private:
QTcpSocket client;
};
client.cpp
#include "client.h"
#include <QHostAddress>
Client::Client(QObject* parent): QObject(parent)
{
connect(&client, SIGNAL(connected()),
this, SLOT(startTransfer()));
}
Client::~Client()
{
client.close();
}
void Client::start(QString address, quint16 port)
{
QHostAddress addr(address);
client.connectToHost(addr, port);
}
void Client::startTransfer()
{
client.write("Hello, world", 13);
}
main.cpp
#include "client.h"
#include <QApplication>
int main(int argc, char** argv)
{
QApplication app(argc, argv);
Client client;
client.start("127.0.0.1", 59001);
return app.exec();
}Code: Alles auswählen
Listen-Aufruf QTcpServer Objekt:
if (!Server.listen(QHostAddress::QHostAddress(address), port)) {
QMessageBox::critical(this, tr("KlingelFeld Server"),
tr("Unable to start the server: %1.")
.arg(Server.errorString()));
close();
return;
}
//else
// newConnection();
Connect und Slot newConnection:
connect(&Server,SIGNAL(newConnection()),this,SLOT(newConnection()));
void KlingelFeld::newConnection()
{
int socketDescriptor;
if (!(socketDescriptor=Server.socketDescriptor())) {
cout<<"Socketdeskripor wrong:"<<socketDescriptor<<endl;
return;
}
cout<<"Socketdeskriptor new:"<<socketDescriptor<<endl;
Thread.newConnection(socketDescriptor);
}
Methode newConnection(int socketDescriptor) der Thread-Klasse:
(hier wird das eigentliche Socketverhalten gemacht)
void KlingelFeldThread::newConnection(int socketDescriptor)
{
QMutexLocker locker(&mutex);
cout<<"Thread noch nicht gestartet"<<endl;
this->socketDescriptor=socketDescriptor;
cout<<"Socketdeskriptor:"<<socketDescriptor<<endl;
quit=false;
if (!isRunning()){
start();
cout<<"Thread gestartet"<<endl;
}
else
cond.wakeOne();
}
Teile der run()-Methode:
while (!quit) {
const int Timeout = 5 * 1000;
cout<<"Timeout setzen"<<endl;
//QTcpSocket socket;
QTcpSocket socket;
cout<<"Socket anlegen mit Socketdescriptor:"<<socketDescriptor<<endl;
if (!socket.setSocketDescriptor(socketDescriptor)) {
emit error(socket.error(), socket.errorString());
cout<<"Socket Fehler 1"<<endl;
return;
}
if (!socket.waitForConnected(Timeout)) {
emit error(socket.error(), socket.errorString());
return;
}
cout<<"Socketdescriptor weitergeben"<<endl;
mutex.lock();
QString text, sockText;
sockText = startReadSocket();
Methode QString startReadSocket():
QString KlingelFeldThread::startReadSocket(){
char buffer[1024] = {0};
QString text;
cout<<"startReadSocket: Text einlesen"<<endl;
socket.read(buffer, socket.bytesAvailable());
cout << buffer << endl;
text=QString::QString(buffer);
return text;
}Kann mir jmnd sagen woran es liegen könnte?
Gruss Michael