2016-08-04 9 views
1

Ich habe eine kleine Chat-Anwendung. Ich kann Daten vom Client zum Server senden, aber ich kann keine Daten vom Server zum Client senden.
dies ist mein Server-Code:
.proQT Serverseite hat einen Fehler in der Schreibfunktion (gestoppt in Thread 0 ...)

QT  += core 
QT  += network 
QT  -= gui 

TARGET = QServer 
CONFIG += console 
CONFIG -= app_bundle 

TEMPLATE = app 


SOURCES += main.cpp \ 
    tcpserver.cpp 

HEADERS += \ 
    tcpserver.h 

//===========================TCPServer.h 


#ifndef TCPSERVER_H 
#define TCPSERVER_H 
#include <QObject> 
#include <QDebug> 
#include <QTcpSocket> 
#include <QTcpServer> 

class TCPServer : public QObject 
{ 
    Q_OBJECT 
public: 
    explicit TCPServer(QObject *parent = 0); 
    ~TCPServer(); 
signals: 

public slots: 
    void newConnection(); 
    void disconnected(); 
    void readyRead(); 
    void writeData(QString data); 

private: 
    QTcpServer *serv; 
    QTcpSocket *socket; 
}; 
#endif // TCPSERVER_H 

//===========================TCPServer.cpp 


#include "tcpserver.h" 

TCPServer::TCPServer(QObject *parent) : QObject(parent) 
{ 
    serv=new QTcpServer(this); 
    connect(serv,SIGNAL(newConnection()),this,SLOT(newConnection())); 
    if(!serv->listen(QHostAddress::Any,3490)) 
    { 
     qDebug()<<"Server Error in Connecting...."<<serv->errorString(); 
    } 
    else 
     qDebug()<<"Server Started  :)  "; 
} 

TCPServer::~TCPServer() 
{ 
    disconnected(); 
} 

void TCPServer::newConnection() 
{ 
    socket=serv->nextPendingConnection(); 
    connect(socket,SIGNAL(disconnected()),this,SLOT(disconnected())); 
    connect(socket,SIGNAL(readyRead()),this,SLOT(readyRead())); 
    socket->write("Hello Client"); 
    socket->flush();//clean the buffer 
    socket->waitForReadyRead(3000); 
    // sock->close(); 
} 

void TCPServer::disconnected() 
{ 
    socket->close(); 
    qDebug()<<"Good By  :)  "; 
} 

void TCPServer::readyRead() 
{ 
    //qDebug()<<"Server is Reading ...."<<socket->readAll(); 
    while(socket->canReadLine()) 
    { 
     QByteArray ba = socket->readLine(); 
     if(strcmp(ba.constData(), "!exit\n") == 0) 
     { 
      socket->disconnectFromHost(); 
      break; 
     } 
     //printf(">> %s", ba.constData()); 
     qDebug() << "Server is receiving ...."<<ba.constData(); 
    } 
} 


void TCPServer::writeData(QString data) 
{ 
    socket->write(data.toStdString().c_str()); 
    socket->flush();//clean the buffer 
    socket->waitForReadyRead(3000); 
} 


//===========================TCPServer/main.cpp 


#include <QCoreApplication> 
#include "tcpserver.h" 

int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 
    TCPServer srv; 
// while(1) 
// { 
     QTextStream s(stdin); 
     QString value = s.readLine(); 
     srv.writeData(value); 
// } 

mein Server Daten vom Client empfängt und zeigt es sehr gut. aber wenn ich Daten senden will vom Server zum Client zeigt es mir diesen Fehler:

blieb Thread 0 von: Ausnahme bei 0x5118cf9a, Code: 0xc0000005: las Zugriffsverletzung bei 0x0x, flags = 0x0 (erste Chance)

.
was bedeutet es?
Wo ist mein Fehler beim Schreiben von Daten auf Socket?

+0

Haben Sie versucht, in einem Debugger ausgeführt, um den Absturz in Aktion zu fangen? Dann können Sie sehen, wo in Ihrem Code es passiert, und auch Variablen untersuchen, um zu sehen, dass ihre Werte in Ordnung sind. –

+0

Entschuldigung. wie geht das? Ich versuche es zu fangen. aber kein Fehler zeigt mir –

+0

Ihre IDE sollte eine Taste oder Menü-Alternative haben, um im Debugger zu laufen. Fang dort an. –

Antwort

1

Ich verschiebe die Eingabehandhabung zu einem neuen Thread und emittiere ein Signal von diesem Thread jedes Mal, wenn Sie eine Eingabe erhalten. (wie thuga Antwort)