crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> QTcpSocket, Совмесная работа 2х компов
TJSonic
  опции профиля:
сообщение 8.2.2010, 23:21
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 2
Регистрация: 8.2.2010
Пользователь №: 1453

Спасибо сказали: 0 раз(а)




Репутация:   0  


В общем так, только недавно начал изучать QT по одной книге проффесиональное программирование на Qt 4.5 там есть пример реализации модели клиент-сервер. Та вот при запуске на одном и томже компе все работает, а как сделать чтобы доступ был с другого компа????Тобишь 1 комп сервер а второй клиент.
Я так понял надо айпи в серверной части и в клиентской задать. Вопрос КАК?

Код:

main.cpp:
#include <QtGui>
#include "MyServer.h"

// ----------------------------------------------------------------------
int main(int argc, char** argv)
{
    QApplication app(argc, argv);
    MyServer     server(2323);

    server.show();

    return app.exec();
}


MyServer.cpp:
#include <QtNetwork>
#include <QtGui>
#include "MyServer.h"

// ----------------------------------------------------------------------
MyServer::MyServer(int nPort, QWidget* pwgt /*=0*/) : QWidget(pwgt)
                                                    , m_nNextBlockSize(0)
{
    m_ptcpServer = new QTcpServer(this);
    if (!m_ptcpServer->listen(QHostAddress::Any, nPort)) {
        QMessageBox::critical(0,
                              "Server Error",
                              "Unable to start the server:"
                              + m_ptcpServer->errorString()
                             );
        m_ptcpServer->close();
        return;
    }
    connect(m_ptcpServer, SIGNAL(newConnection()),
            this,         SLOT(slotNewConnection())
           );

    m_ptxt = new QTextEdit;
    m_ptxt->setReadOnly(true);

    //Layout setup
    QVBoxLayout* pvbxLayout = new QVBoxLayout;    
    pvbxLayout->addWidget(new QLabel("<H1>Server</H1>"));
    pvbxLayout->addWidget(m_ptxt);
    setLayout(pvbxLayout);
}

// ----------------------------------------------------------------------
/*virtual*/ void MyServer::slotNewConnection()
{
    QTcpSocket* pClientSocket = m_ptcpServer->nextPendingConnection();
    connect(pClientSocket, SIGNAL(disconnected()),
            pClientSocket, SLOT(deleteLater())
           );
    connect(pClientSocket, SIGNAL(readyRead()),
            this,          SLOT(slotReadClient())
           );

    sendToClient(pClientSocket, "Server Response: Connected!");
}

// ----------------------------------------------------------------------
void MyServer::slotReadClient()
{
    QTcpSocket* pClientSocket = (QTcpSocket*)sender();
    QDataStream in(pClientSocket);
    in.setVersion(QDataStream::Qt_4_5);
    for (;;) {
        if (!m_nNextBlockSize) {
            if (pClientSocket->bytesAvailable() < sizeof(quint16)) {
                break;
            }
            in >> m_nNextBlockSize;
        }

        if (pClientSocket->bytesAvailable() < m_nNextBlockSize) {
            break;
        }
        QTime   time;
        QString str;
        in >> time >> str;

        QString strMessage =
            time.toString() + " " + "Client has sent - " + str;
        m_ptxt->append(strMessage);

        m_nNextBlockSize = 0;

        sendToClient(pClientSocket,
                     "Server Response: Received \"" + str + "\""
                    );
    }
}

// ----------------------------------------------------------------------
void MyServer::sendToClient(QTcpSocket* pSocket, const QString& str)
{
    QByteArray  arrBlock;
    QDataStream out(&arrBlock, QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_4_5);
    out << quint16(0) << QTime::currentTime() << str;

    out.device()->seek(0);
    out << quint16(arrBlock.size() - sizeof(quint16));

    pSocket->write(arrBlock);
}


MyServer.h:
/* ======================================================================
**  MyServer.h
** ======================================================================
**
** ======================================================================
**  Copyright (c) 2007 by Max Schlee
** ======================================================================
*/
#ifndef _MyServer_h_
#define _MyServer_h_

#include <QWidget>

class QTcpServer;
class QTextEdit;
class QTcpSocket;

// ======================================================================
class MyServer : public QWidget {
Q_OBJECT
private:
    QTcpServer* m_ptcpServer;
    QTextEdit*  m_ptxt;
    quint16     m_nNextBlockSize;

private:
    void sendToClient(QTcpSocket* pSocket, const QString& str);

public:
    MyServer(int nPort, QWidget* pwgt = 0);

public slots:
    virtual void slotNewConnection();
            void slotReadClient   ();
};
#endif  //_MyServer_h_
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
sploid
  опции профиля:
сообщение 9.2.2010, 14:53
Сообщение #2


Студент
*

Группа: Участник
Сообщений: 51
Регистрация: 26.2.2008
Из: Москва
Пользователь №: 106

Спасибо сказали: 10 раз(а)




Репутация:   1  


может фаервол блокирует?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
TJSonic
  опции профиля:
сообщение 9.2.2010, 16:55
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 2
Регистрация: 8.2.2010
Пользователь №: 1453

Спасибо сказали: 0 раз(а)




Репутация:   0  


Ну вопервых как я понял программа написана для работы на локалхосте...мне кажеться надо гдето указать айпи сервера(мой айпи) и в клиенте тожесамое записать ато айпишник пингуеться а с портом нет.....тоесть сервер не прослушиваеться на этом айпишнике на этом порте)Вот как его заставить?)

П.С. файрвола и там и там нет)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
pedro
  опции профиля:
сообщение 3.3.2010, 6:31
Сообщение #4


Новичок


Группа: Новичок
Сообщений: 1
Регистрация: 3.3.2010
Пользователь №: 1503

Спасибо сказали: 0 раз(а)




Репутация:   0  


это необходимо делать в клиентской части в функции main



int main(int argc, char** argv)
{
QApplication app(argc, argv);
MyClient client("localhost", 2323);
client.show();
return app.exec();
}



вместо localhost пишем ип компа на котором запущен сервер
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 21.9.2019, 16:42