Russian Qt Forum

Qt => Работа с сетью => Тема начата: Omg от Январь 31, 2011, 11:16



Название: QTcpSocket чат клиент-сервер.
Отправлено: Omg от Январь 31, 2011, 11:16
И снова мне нужна помощь. :(
Организовать одно соединение, могу.
Так же реализовать на обоих сторонах клинт+сервер, получается, но мне кажется это жутко криво и не правильно. После чего сервер рассылает всем подключенным на первый порт клиентам, приходящие сообщения и прочую инфу. А от них получает инфу по первому порту, в общем такая одностороняя связь получается. ^^
Не подскажите, как можно реализовать подобное через один сокет, а не два, как у меня. Просто с ними мороки в два раза больше, да и выглядит это все прямо скажем кривовато.
Ссылки давать читать не надо. Я полистал один чат (довольно больших размеров, пока не смог разобраться, а править весь чат не очень хочется, больше жажду не копипастить, а понимать), разбирал пример нетворк чата из примеров асистента - только локальный.
И еще вопрос, а upd broadcast пропускают через маршрутизаторы? Насколько я помню, все широковещательные пакеты они режут и оставляют внутри сети. А для меня это нисколько не подходит. :(


Название: Re: QTcpSocket чат клиент-сервер.
Отправлено: Omg от Январь 31, 2011, 12:38
решил вопрос сам. %)
в заголовочном:
Код:
QList<QTcpSocket*>* ipAddress;
В конструкторе объекта:
Код:
ipAddress    = new QList<QTcpSocket*>;
В Новом соединении:
Код:
    QTcpSocket* pClientSocket = m_ptcpServer->nextPendingConnection();
    ipAddress->operator <<(pClientSocket);
В рассылке сообщений:
Код:
QList<QTcpSocket*>::iterator it=ipAddress->begin();
    for(; it != ipAddress->end(); ++it){
        pSocket = *it;

надеюсь что все верно


Название: Re: QTcpSocket чат клиент-сервер.
Отправлено: Omg от Январь 31, 2011, 18:44
Назрела новая проблема  ;D
Н
Код:
public slots:
    void slotError                (QAbstractSocket::SocketError); //слот, еррор
    void         slotUpdateUsers  (QTcpSocket* pSocket         );//Обновляем список пользователей();//Обновляем список пользователей
    virtual void slotNewConnection();
    void         slotReadClient   ();

Код:
void MyServer::slotNewConnection() // описываем слот нового соединения
{
    QTcpSocket* pClientSocket = m_ptcpServer->nextPendingConnection();
    if (!ipAddress->contains(pClientSocket)){
        ipAddress->operator <<(pClientSocket);
    }
    connect(pClientSocket, SIGNAL(disconnected()   ),
            this,          SLOT  (slotUpdateUsers(pClientSocket))
            );
    connect(pClientSocket, SIGNAL(readyRead()      ),
            this,          SLOT  (slotReadClient() )
            );
    sendToClient(pClientSocket,"Connected to server.",1);
}

void MyServer::slotUpdateUsers  (QTcpSocket* pSocket){
    brow->append("remuved?!");//проверка не проходит
    if(ipAddress->removeOne(pSocket))brow->append("remuved");//тоже самое
    pSocket->deleteLater();
}

непонимаю, почему слот не вызывается  ???
Со стороны клиента вызывал disconnectFromHost () все равно не робит. :(


Название: Re: QTcpSocket чат клиент-сервер.
Отправлено: merke от Февраль 01, 2011, 06:11
Для начала в ньюконнекшин коннектишь вот это:

Код:
connect(pClientSocket, SIGNAL(disconnected()), this, SLOT(OnDisonnected()));

Слот OnDisconnected() должен выглядеть следующим образом:

Код:
void MainWindow::OnDisonnected()
{
    QTcpSocket *pClient = (QTcpSocket *)sender();
    brow->append("remuved?!");//проверка не проходит
    if(ipAddress->removeOne(pClient))brow->append("remuved");//тоже самое
    pClient->deleteLater();
}


Название: Re: QTcpSocket чат клиент-сервер.
Отправлено: Omg от Февраль 01, 2011, 16:48
Спасибо, я попробую, как будет возможность.