В общем так, только недавно начал изучать 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();
}
#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
** ======================================================================
**
** ======================================================================
** 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_
может фаервол блокирует?
Ну вопервых как я понял программа написана для работы на локалхосте...мне кажеться надо гдето указать айпи сервера(мой айпи) и в клиенте тожесамое записать ато айпишник пингуеться а с портом нет.....тоесть сервер не прослушиваеться на этом айпишнике на этом порте)Вот как его заставить?)
П.С. файрвола и там и там нет)
это необходимо делать в клиентской части в функции main
int main(int argc, char** argv)
{
QApplication app(argc, argv);
MyClient client("localhost", 2323);
client.show();
return app.exec();
}
вместо localhost пишем ип компа на котором запущен сервер
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)