LINUX.ORG.RU

QtNetwork


0

1

Хочу сделать клиент серверное приложение ЧАТ. Пишу сначала сервер, в качестве клиента взял example подредактированый мной.У сервера есть много клиентов, я их храню в в Qlist< QTcpSocket*>. Сервер уже умеет отправлять клиентам сообщение. Надо сделать так чтоб умел и принимать. Перед заносом в Qlist< QTcpSocket*> я делаю connect(clientConnection,SIGNAL(readyRead()), this,SLOT(getMess())); А в getMess() проверяю кто мне что-то послал.

void Server::getMess(){
    QTcpSocket * con;
    foreach(con,Users){
        if (con->bytesAvailable()>0){
            QByteArray data = con->read(con->bytesAvailable());
            QString myString(data);
            qDebug()<<myString;
        }
    }

}

Но почему-то myString выходит пустой.

В клиенте посылаю так

    QByteArray block;
    QDataStream out(&block, QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_4_0);
    out << (quint16)0;
    out << "Hello Server";
    out.device()->seek(0);
    out << (quint16)(block.size() - sizeof(quint16));
    tcpSocket->write(block);

out << (quint16)0;
out << «Hello Server»;

Первый записанный ноль судя по всему интерпретируются внутри getMess как конец строки.

m0rph ★★★★★
()

QDataStream out
QString myString(data);

И чего ты от этого кода ожидаешь?
Попробуй для эксперимента убрать «сеть», и просто в одном и том же месте (в функции main, например) записать данные через QDataStream в QByteArray и «прочитать» их QString'ом.

anonymous
()

Тогда уж так:

void Server::getMess(){
    QTcpSocket * con = qobject_cast<QTcpSocket*>(sender());
    Q_ASSERT(con);

    QByteArray data = con->readAll();
    if(!data.isEmpty()) {
        QString myString(data);
        qDebug()<<myString;
    }
}
Кстати неплохо было ввести код для определения начала пакета

m0rph ★★★★★
()

Пишешь через QDataStream, так и читай через него.

panter_dsd ★★★★
()
Ответ на: комментарий от panter_dsd

Еще один «знаток». Нет, ну конечно, можно так делать в редких случаях, но какое это имеет отношение к коду выше?

anonymous
()
Ответ на: комментарий от yoghurt

Поспорим, что если заменить foreach на sender(), строки не появятся?

Но foreach явно тут ни к месту. По-хорошему нужно делать надстройку над каждым сокетом, которая будет обрабатывать приходящие данные, зная заранее от кого они приходят.

anonymous
()
Ответ на: комментарий от anonymous

Поспорим, что если заменить foreach на sender(), строки не появятся?

Не появятся, но форыч тут юзать один фиг кривулина

yoghurt ★★★★★
()
Ответ на: комментарий от yoghurt

Не появятся, но форыч тут юзать один фиг кривулина

Согласен.

anonymous
()
Ответ на: комментарий от m0rph

Не особо понятно

Во первых, почему вы используете явное приведение к типу <QTcpSocket*> потом, от куда взялся sender() что это? И зачем проверяете на Q_ASSERT? Ну и последнее, оно не работает.

vsrmis
() автор топика
Ответ на: Не особо понятно от vsrmis

почему вы используете явное приведение к типу <QTcpSocket*>

Потому что sender возвращает QObject*, который не имеет нужного тебе интерфейса.

от куда взялся sender() что это?

Открой уже документацию:
http://doc.qt.nokia.com/latest/qobject.html#sender

И зачем проверяете на Q_ASSERT?

Потому что ты ожидаешь, что сигнал придет от QTcpSocket'а, а значит остальные случаи - это ошибка быдлокодера.

Ну и последнее, оно не работает.

Уже как минимум дважды сказали почему.

anonymous
()
Ответ на: комментарий от anonymous

Ух-ты, не слышал про такой замечательный метод.Тогда форич это правда быдлокод. Я пришел к выводу что проблема не при передаче а при преобразовании как сказал anonymous (30.11.2011 23:21:54)

вот хочу протестить без сети [code] QByteArray block; QDataStream streem(&block, QIODevice::ReadWrite); streem.setVersion(QDataStream::Qt_4_0); streem << «Hello Qt»; QByteArray block2; streem>>block2; qDebug()<<QString(block2); [/code] Но выводиться всё равно пустая строка.

vsrmis
() автор топика
Ответ на: комментарий от vsrmis

Ух-ты, не слышал про такой замечательный метод.

Это не замечательный метод, его следует избегать, если есть такая возможность.

Но выводиться всё равно пустая строка.

Потому что это stream (поток) - ты кладешь в него переменную, он ее сохраняет и двигается дальше, ожидая следующую порцию.
Так как ты не создаешь отдельный поток для чтения и не перематываешь уже существующий, при попытке прочесть какие-то данные, они читаются с конца, где их очевидно нет.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.