на стороне сервера
создание
QHostAddress hostadd("192.168.1.2");
if (!tcpServer->listen(hostadd,55555))
{
QMessageBox::critical(this, tr("Lin Server"),
tr("Невозможно запустить сервер: %1.")
.arg(tcpServer->errorString()));
close();
return;
}
ipAddress = hostadd.toString();
createStatusBar();
createDockWindows();
setCentralWidget(TableWidget);
connect(tcpServer, SIGNAL(newConnection()), this, SLOT(sendWelcomeMessage()));
посылка приветственного сообщения при соединение
void MainWindow::sendWelcomeMessage()
{
blockSize = 0;
QString str = ">>Добро пожаловать ,вы подключились к серверу";
clientConnection = tcpServer->nextPendingConnection();
connect(clientConnection, SIGNAL(readyRead()), this, SLOT(readMessage()));
sendMessage(0,str);
}
отправка сообщения
void MainWindow::sendMessage(int code,QString Msg)
{
QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_0);
out << (quint16)0;
out << (int)code;
switch(code)
{
case 0:
out << Msg;
break;
}
out.device()->seek(0);
out << (quint16)(block.size() - sizeof(quint16));
clientConnection->write(block);
};
чтение сообщения
void MainWindow::readMessage()
{
QDataStream in(clientConnection);
in.setVersion(QDataStream::Qt_4_0);
if (blockSize == 0) {
if (clientConnection->bytesAvailable() < (int)sizeof(quint16))
return;
in >> blockSize;
}
if (clientConnection->bytesAvailable() < blockSize)
return;
int code = 0;
in >> code;
switch(code)
{ case 0:
{
QString str;
in >> str;
TextBrowser->append(str);
sendMessage(0,str);
break;
}
case 1:
{
QString log;
QString pass;
in >> log;
in >> pass;
if(!createConnection(&log,&pass))
QMessageBox::critical(0, QObject::tr("Database Error"),
db->lastError().text());
else
TextBrowser->append(">>"+log+" вошел в базу данных");
break;
}
}
};
********************....*******************************
на стороне клиента
запись
void MainWindow::sendMessage(int code,QString Msg)
{
QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_0);
out << (quint16)0;
out << (int)code;
switch(code)
{
case 0:
out << Msg;
break;
case 1:
out << nameEdit->text();
out << pasEdit->text();
break;
}
out.device()->seek(0);
out << (quint16)(block.size() - sizeof(quint16));
tcpSocket->write(block);
};
чтение
void MainWindow::readMessage()
{
QDataStream in(tcpSocket);
in.setVersion(QDataStream::Qt_4_0);
if (blockSize == 0) {
if (tcpSocket->bytesAvailable() < (int)sizeof(quint16))
return;
in >> blockSize;
}
if (tcpSocket->bytesAvailable() < blockSize)
return;
int code = 0;
in >> code;
if(code == 0)
{
QString str;
in >> str;
TextBrowser->append(str);;
}
}
сдесь отправляется только одно сообщение
void MainWindow::requestNewServer()
{
blockSize = 0;
tcpSocket->abort();
tcpSocket->connectToHost(hostEdit->text(),
portEdit->text().toInt());
sendMessage(0,">>Клиент "+nameEdit->text()+" подключен");
sendMessage(1);
};
нужно чтобы отправлялись оба, как сделать синхронную передачу?
А зачем отправлять такую строку на сервер?
">>Клиент "+nameEdit->text()+" подключен"
Можно передать имя, а остальную часть подставит сам сервак. Передача лишних данных.. то же самое отправка строки с сервера. Отправляй код, а строку в клиенте создавай.
По теме: 2ое сообщение вообще не передается или передается, но не приходит?
Попробуй продебажить readMessage().
По теме: 2ое сообщение вообще не передается или передается, но не приходит?
Попробуй продебажить readMessage().
потом заменю на чистые команды) просто тестирую)
в клиенте оно передается, на сервере не приходит(не обрабатывается), сигнал не срабатывает. Хотя первый
sendMessage(0,">>Клиент "+nameEdit->text()+" подключен"); обрабатывает
просто может оно отсылает второй пакет до того как сервер готов принять его?
sendMessage(0,">>Клиент "+nameEdit->text()+" подключен");
int i=10000;
while (i!=0)
{
i--;
}
sendMessage(1);
тоже нет, скорее я не понимаю способ их взаимодействия)