Russian Qt Forum
Ноябрь 24, 2024, 04:11 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTcpSocket чат клиент-сервер.  (Прочитано 4828 раз)
Omg
Гость
« : Январь 31, 2011, 11:16 »

И снова мне нужна помощь. Грустный
Организовать одно соединение, могу.
Так же реализовать на обоих сторонах клинт+сервер, получается, но мне кажется это жутко криво и не правильно. После чего сервер рассылает всем подключенным на первый порт клиентам, приходящие сообщения и прочую инфу. А от них получает инфу по первому порту, в общем такая одностороняя связь получается. ^^
Не подскажите, как можно реализовать подобное через один сокет, а не два, как у меня. Просто с ними мороки в два раза больше, да и выглядит это все прямо скажем кривовато.
Ссылки давать читать не надо. Я полистал один чат (довольно больших размеров, пока не смог разобраться, а править весь чат не очень хочется, больше жажду не копипастить, а понимать), разбирал пример нетворк чата из примеров асистента - только локальный.
И еще вопрос, а upd broadcast пропускают через маршрутизаторы? Насколько я помню, все широковещательные пакеты они режут и оставляют внутри сети. А для меня это нисколько не подходит. Грустный
Записан
Omg
Гость
« Ответ #1 : Январь 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;

надеюсь что все верно
Записан
Omg
Гость
« Ответ #2 : Январь 31, 2011, 18:44 »

Назрела новая проблема  Смеющийся
Н
Код:
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 () все равно не робит. Грустный
« Последнее редактирование: Январь 31, 2011, 19:29 от Omg » Записан
merke
Гость
« Ответ #3 : Февраль 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();
}
Записан
Omg
Гость
« Ответ #4 : Февраль 01, 2011, 16:48 »

Спасибо, я попробую, как будет возможность.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.047 секунд. Запросов: 21.