2015-08-04 6 views
1

Я получаю ошибку:устройство не открывается ошибка + QIODevice :: написать

QIODevice::write (QTcpSocket): device not open. After trying , I think problem is passing parameter server->nextPendingConnection() into object. Can someone has idea how to do it correctly?

Я понимаю, что объект для socketClient не инициализирован должным образом. Я использую Ubuntu с Qt.

Я использую сервер, используя Qt. Часть сервера имеет два класса на основе QTcpServer и QTcpSocket. Server и SocketClient. Я создаю объект SocketClient на сервере и для целей тестирования Я открыл сеанс telnet и хочу видеть, что сервер пишет «привет» на терминале. Но как-то его не работает. Может кто-нибудь, пожалуйста, посоветуйте мне, где я делаю ошибку.

Server::Server(QObject *parent) : QObject(parent) 
{ 
    server_obj = new QTcpServer(this); 
} 

void Server::startServer() 
{ 
    connect(server_obj, SIGNAL(newConnection()), this, SLOT(incomingConnection())); 
    if(!server_obj->listen(QHostAddress::Any, 9999)) 
    { 
    qDebug() << " Server failed to get started"; 
    } 
    else 
    { 
    qDebug() << " Server started"; // this is successful 
    } 
} 


void Server::incomingConnection() 
{ 
    socketforClient = new SockClient(server_obj->nextPendingConnection());// has a doubt on nextPendingconection?? 

    //only for testing remove it 
    socketforClient->writeToClient(); 
} 

Класс для клиента

* Description: Its a constructor.I have changed default constructor to add QTcpSocket* object in parameter.I used this constructor in void Server::incomingConnection() 
*/ 
SockClient::SockClient(QObject *parent,QTcpSocket* socket) : QObject(parent) 
{ 
    socketClient = new QTcpSocket(socket); 

qDebug() << " we are in constructor of 1st sockclient "; 

} 



// this is for testing purpose only 

void SockClient::writeToClient() 
{ 
    socketClient->write(" hello world\r\n"); 
    socketClient->flush(); 
    socketClient->waitForBytesWritten(3000); 

} 

// заголовок файла из SockClient

class SockClient : public QObject 
{ 
    Q_OBJECT 
public: 

explicit SockClient(QObject *parent, QTcpSocket* socket= 0); // I have created 
    void writeToClient(); // This is for testing purpose 
~SockClient(); 
signals: 

private slots: 
    void readClient(); 

private: 
    void sendResponsetoMops(); 

    QTcpSocket *socketClient; 

    quint16 nextBlockSize; 

public slots: 
}; 
+0

ли конструктор SockClient аргумент по умолчанию для него это второй параметр ('socket')? – Jan

+0

@Jan 1, нет, у него нет – samprat

ответ

0

Вы используете:

socketClient = new QTcpSocket(socket); 

Попробуйте использовать следующий код вместо:

socketClient = socket; 

И использовать socketforClient = new SockClient(this, server->nextPendingConnection());

вместо

socketforClient = new SockClient(server->nextPendingConnection()); 
+0

Нет, он не работает, если программа сработает, и это имеет смысл, потому что socketClient = socket, выходит за рамки. – samprat

+0

Не могли бы вы сначала проверить, что ваше серверное приложение прослушивает порт: 9999. В Linux попробуйте: netstat -nap | grep LISTEN –

+0

Ну, Мурад, я попробовал что-то еще, и это работает, но я этого не хочу. То, что я сделал, было -> 1) в функции void Server :: incomingConnection() Я добавил следующую строку QTcpSocket * socket = server-> nextPendingConnection(); socket-> write ("Hello client \ r \ n"); гнездо-> флеш(); гнездо-> waitForBytesWritten (3000); гнездо-> близко(); } – samprat

Смежные вопросы