#include <QtGui>
#include <QtNetwork>
#include <QBuffer>
#include <stdlib.h>
#include "server.h"
{
lblPort
= new QLabel(tr
("Port:"));
lblPort->setBuddy(lePort);
btnStart->setDisabled(true);
btnStop->setDisabled(true);
twClientConnected->setColumnCount(2);
slTreeLabel << tr("Address") << tr("Port");
twClientConnected->setHeaderLabels(slTreeLabel);
twClientConnected->header()->setStretchLastSection(false);
twClientConnected
->header
()->setResizeMode
(QHeaderView::Stretch);
twClientConnected->addTopLevelItems(liClients);
twClientConnected->takeTopLevelItem(0);
twClientConnected->takeTopLevelItem(0);
lblStatus
->setFrameShape
(QLabel::Panel);
lblStatus
->setFrameShadow
(QLabel::Sunken);
lblStatus->setText(tr("Ready"));
btnQuit->setAutoDefault(false);
teMessage->setReadOnly(true);
connect(lePort,
SIGNAL(textChanged
(QString)),
this,
SLOT(slotStartButtonEnable
()));
connect(btnStart, SIGNAL(clicked()), this, SLOT(slotStartClicked()));
connect(btnStop, SIGNAL(clicked()), this, SLOT(slotStopClicked()));
connect(btnQuit, SIGNAL(clicked()), this, SLOT(close()));
connect(tcpServer, SIGNAL(newConnection()), this, SLOT(slotNewClient()));
portLayout->addWidget(lblPort);
portLayout->addWidget(lePort);
portLayout->addStretch(1);
portLayout->addWidget(btnStart);
portLayout->addWidget(btnStop);
gbServerControl->setLayout(portLayout);
clientLayout->addWidget(twClientConnected);
gbConnectedClient->setLayout(clientLayout);
messageLayout->addWidget(teMessage);
gbMessage->setLayout(messageLayout);
bottomLayout->addWidget(lblStatus, 1);
bottomLayout->addWidget(btnQuit);
mainLayout->addWidget(gbServerControl);
mainLayout->addWidget(gbConnectedClient);
mainLayout->addWidget(gbMessage);
mainLayout->addLayout(bottomLayout);
setLayout(mainLayout);
setWindowTitle(tr("TCP Chat Server - by Strife Low"));
lePort->setFocus();
}
Server::~Server()
{
}
void Server::sendToClients(const QByteArray& line)
{
{
connection->write(line);
}
}
void Server::slotStartButtonEnable()
{
btnStart->setDisabled(false);
}
void Server::slotStartClicked()
{
lblStatus->setText(tr("Server starting"));
if (lePort->text() == "")
{
QMessageBox::critical(this, tr
("Server"), tr
("Please enter a valid port number"));
return;
}
if (lePort->text().toInt() > 65535)
{
lePort->setText("65535");
}
if (!tcpServer
->listen
(QHostAddress::Any, lePort
->text
().
toInt())) { QMessageBox::critical(this, tr
("Server"), tr
("Unable to start the server: %1.").
arg(tcpServer
->errorString
()));
return;
}
btnStart->setDisabled(true);
btnStop->setDisabled(false);
lePort->setDisabled(true);
lblStatus->setText(tr("Server started at port %1").arg(tcpServer->serverPort()));
}
void Server::slotStopClicked()
{
btnStart->setEnabled(true);
btnStop->setEnabled(false);
lePort->setDisabled(false);
if (tcpServer->isListening())
{
tcpServer->close();
}
if (!connections.isEmpty())
{
{
connection->close();
}
connections.clear();
}
if (serverSocket->isValid())
{
serverSocket->close();
}
lblStatus->setText(tr("Server stopped"));
}
void Server::slotNewClient()
{
if (!connections.isEmpty())
{
{
connection->write(msg);
}
}
serverSocket = tcpServer->nextPendingConnection();
tmpClientAddressPort << tr("%1").arg(serverSocket->peerAddress().toString()) << tr("%1").arg(serverSocket->peerPort());
liClients.
append(new QTreeWidgetItem(twClientConnected, tmpClientAddressPort
));
//itemList.insert(serverSocket, (liClients.count() - 1));
//tmpClientAddressPort.clear();
connections.append(serverSocket);
buffers.insert(serverSocket, buffer);
connect(serverSocket, SIGNAL(disconnected()), this, SLOT(slotClientDisconnected()));
connect(serverSocket, SIGNAL(readyRead()), this, SLOT(slotSocketRead()));
}
void Server::slotClientDisconnected()
{
QTcpSocket* socket
= static_cast<QTcpSocket
*>
(sender
());
QBuffer* buffer
= buffers.
take(socket
);
buffer->close();
buffer->deleteLater();
connections.removeAll(socket);
socket->deleteLater();
{
connection->write(msg);
}
}
void Server::slotSocketRead()
{
QTcpSocket* socket
= static_cast<QTcpSocket
*>
(sender
());
QBuffer* buffer
= buffers.
value(socket
);
qint64 bytes = buffer->write(socket->readAll());
buffer->seek(buffer->pos() - bytes);
while (buffer->canReadLine())
{
sendToClients(line);
teMessage->append(line);
}
}
// end of file