i am writing a chat application using TCP.
i found a simple exemple of text chat here : http://www.qtcentre.org/wiki/index.p...le=Simple_chat.
i edited its code so that it can send QByteArray data instead of Qstring like it did in the beginning,but after editing, Server didn't send back message to clients.
help me fix my code.
a part of simplechatclient.cpp :
void SimpleChatClient::sendMessage()
{
if(socket == NULL) return;
QString data
= "<" + nick
->text
().
toLatin1() + "> " + message
->text
().
toLatin1() + "\n";
out << (quint32) 0;
out << msg;
out << data;
out.device()->seek(0);
out << (quint32)(block.size() - sizeof(quint32));
socket->write(block);
socket->flush();
message->clear();
"Client send ok." );
}
void SimpleChatClient::receiveMessage()
{
if (socket == NULL) return;
//in.setVersion( in.version() ); // set to the current Qt version instead
if(blockSize == 0) {
if (socket->bytesAvailable() < (int)sizeof(quint32)) return;
in >> blockSize;
}
if(socket->bytesAvailable() < blockSize) return;
in >> msgString;
in >> msgData;
chat->append(msgData);
blockSize = 0;
if(socket->bytesAvailable() > 0) receiveMessage();
}
void SimpleChatClient::sendMessage()
{
if(socket == NULL) return;
if(socket->state() != QAbstractSocket::ConnectedState ) return;
QString msg = "TEXT";
QString data = "<" + nick->text().toLatin1() + "> " + message->text().toLatin1() + "\n";
QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_2);
out << (quint32) 0;
out << msg;
out << data;
out.device()->seek(0);
out << (quint32)(block.size() - sizeof(quint32));
socket->write(block);
socket->flush();
message->clear();
QMessageBox::information( new QWidget, "Application name",
"Client send ok." );
}
void SimpleChatClient::receiveMessage()
{
if (socket == NULL) return;
if (socket->state() != QAbstractSocket::ConnectedState) return;
QDataStream in(socket);
in.setVersion(QDataStream::Qt_4_2);
//in.setVersion( in.version() ); // set to the current Qt version instead
if(blockSize == 0) {
if (socket->bytesAvailable() < (int)sizeof(quint32)) return;
in >> blockSize;
}
if(socket->bytesAvailable() < blockSize) return;
QString msgString;
QString msgData;
in >> msgString;
in >> msgData;
chat->append(msgData);
blockSize = 0;
if(socket->bytesAvailable() > 0) receiveMessage();
}
To copy to clipboard, switch view to plain text mode
a part of simplechatsever.cpp :
void SimpleChatServer::receiveMessage()
{
QTcpSocket* socket
= static_cast<QTcpSocket
*>
(sender
());
if (socket == NULL) return;
if (blockSize == 0) {
if (socket->bytesAvailable() < (int)sizeof(quint32)) return;
in >> blockSize;
}
if (socket->bytesAvailable() < blockSize) return;
in >> msgString;
in >> msgData;
emit onMessage( msgString, msgData );
blockSize = 0;
if (socket->bytesAvailable() > 0) receiveMessage();
}
void SimpleChatServer
::onMessage(const QString &msg,
const QString &data
) {
out << (quint32) 0;
out << msg;
out << data;
out.device()->seek(0);
out << (quint32)(block.size() - sizeof(quint32));
{
connection->write(block);
connection->flush();
}
}
void SimpleChatServer::receiveMessage()
{
QTcpSocket* socket = static_cast<QTcpSocket*>(sender());
if (socket == NULL) return;
if ( socket->state() != QAbstractSocket::ConnectedState ) return;
QDataStream in(socket);
in.setVersion(QDataStream::Qt_4_2);
if (blockSize == 0) {
if (socket->bytesAvailable() < (int)sizeof(quint32)) return;
in >> blockSize;
}
if (socket->bytesAvailable() < blockSize) return;
QString msgString;
QString msgData;
in >> msgString;
in >> msgData;
emit onMessage( msgString, msgData );
blockSize = 0;
if (socket->bytesAvailable() > 0) receiveMessage();
}
void SimpleChatServer::onMessage(const QString &msg, const QString &data)
{
QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_2);
out << (quint32) 0;
out << msg;
out << data;
out.device()->seek(0);
out << (quint32)(block.size() - sizeof(quint32));
foreach (QTcpSocket* connection, connections)
{
connection->write(block);
connection->flush();
}
}
To copy to clipboard, switch view to plain text mode
Bookmarks