I want to show the connected client in tree. I am able to create the tree but i having problem to remove it when a client is disconnected.

Header file:
Qt Code:
  1. #ifndef SERVER_H
  2. #define SERVER_H
  3.  
  4. #include <QDialog>
  5. #include <QList>
  6. #include <QHash>
  7.  
  8. class QLabel;
  9. class QTcpSocket;
  10. class QTextEdit;
  11. class QTcpServer;
  12. class QLineEdit;
  13. class QBuffer;
  14.  
  15. class Server : public QDialog
  16. {
  17. Q_OBJECT
  18.  
  19. public:
  20. Server(QWidget *parent = 0);
  21. ~Server();
  22.  
  23. protected:
  24. void sendToClients(const QByteArray& line);
  25.  
  26. private slots:
  27. //void sendMessage();
  28. void slotStartButtonEnable();
  29. void slotStartClicked();
  30. void slotStopClicked();
  31.  
  32. void slotNewClient();
  33. void slotClientDisconnected();
  34.  
  35. void slotSocketRead();
  36.  
  37. private:
  38. QList<QTcpSocket*> connections;
  39. QHash<QTcpSocket*, QBuffer*> buffers;
  40. //QHash<QTcpSocket*, int> itemList;
  41. QList<QTreeWidgetItem *> liClients;
  42. QTreeWidget *twClientConnected;
  43. QStringList slTreeLabel;
  44. QLineEdit *lePort;
  45. QLabel *lblPort;
  46. QLabel *lblStatus;
  47. QPushButton *btnQuit;
  48. QPushButton *btnStart;
  49. QPushButton *btnStop;
  50. QTcpSocket *serverSocket;
  51. QTcpServer *tcpServer;
  52. QTextEdit *teMessage;
  53. };
  54.  
  55. #endif
To copy to clipboard, switch view to plain text mode 

Source file:
Qt Code:
  1. #include <QtGui>
  2. #include <QtNetwork>
  3. #include <QBuffer>
  4.  
  5. #include <stdlib.h>
  6.  
  7. #include "server.h"
  8.  
  9. Server::Server(QWidget *parent)
  10. : QDialog(parent)
  11. {
  12. lblPort = new QLabel(tr("Port:"));
  13. lePort = new QLineEdit;
  14. QRegExp regExp("[1-9][0-9]{0,4}");
  15. lePort->setValidator(new QRegExpValidator(regExp, this));
  16. lblPort->setBuddy(lePort);
  17.  
  18. btnStart = new QPushButton(tr("Start"));
  19. btnStop = new QPushButton(tr("Stop"));
  20. btnStart->setDisabled(true);
  21. btnStop->setDisabled(true);
  22.  
  23. QGroupBox *gbServerControl = new QGroupBox(tr("Server Control"));
  24. QGroupBox *gbMessage = new QGroupBox(tr("Message"));
  25. QGroupBox *gbConnectedClient = new QGroupBox(tr("Connected Client"));
  26.  
  27. twClientConnected = new QTreeWidget();
  28. twClientConnected->setColumnCount(2);
  29. slTreeLabel << tr("Address") << tr("Port");
  30. twClientConnected->setHeaderLabels(slTreeLabel);
  31. twClientConnected->header()->setStretchLastSection(false);
  32. twClientConnected->header()->setResizeMode(QHeaderView::Stretch);
  33. liClients.append(new QTreeWidgetItem(twClientConnected, QStringList(QString(""))));
  34. twClientConnected->addTopLevelItems(liClients);
  35. twClientConnected->takeTopLevelItem(0);
  36. twClientConnected->takeTopLevelItem(0);
  37.  
  38. lblStatus = new QLabel;
  39. lblStatus->setFrameShape(QLabel::Panel);
  40. lblStatus->setFrameShadow(QLabel::Sunken);
  41. lblStatus->setText(tr("Ready"));
  42.  
  43. btnQuit = new QPushButton(tr("Quit"));
  44. btnQuit->setAutoDefault(false);
  45.  
  46. teMessage = new QTextEdit(this);
  47. teMessage->setReadOnly(true);
  48.  
  49. tcpServer = new QTcpServer(this);
  50. serverSocket = new QTcpSocket(this);
  51.  
  52. connect(lePort, SIGNAL(textChanged(QString)), this, SLOT(slotStartButtonEnable()));
  53. connect(btnStart, SIGNAL(clicked()), this, SLOT(slotStartClicked()));
  54. connect(btnStop, SIGNAL(clicked()), this, SLOT(slotStopClicked()));
  55. connect(btnQuit, SIGNAL(clicked()), this, SLOT(close()));
  56. connect(tcpServer, SIGNAL(newConnection()), this, SLOT(slotNewClient()));
  57.  
  58. QHBoxLayout *portLayout = new QHBoxLayout;
  59. portLayout->addWidget(lblPort);
  60. portLayout->addWidget(lePort);
  61. portLayout->addStretch(1);
  62. portLayout->addWidget(btnStart);
  63. portLayout->addWidget(btnStop);
  64. gbServerControl->setLayout(portLayout);
  65.  
  66. QHBoxLayout *clientLayout = new QHBoxLayout;
  67. clientLayout->addWidget(twClientConnected);
  68. gbConnectedClient->setLayout(clientLayout);
  69.  
  70. QHBoxLayout *messageLayout = new QHBoxLayout;
  71. messageLayout->addWidget(teMessage);
  72. gbMessage->setLayout(messageLayout);
  73.  
  74. QHBoxLayout *bottomLayout = new QHBoxLayout;
  75. bottomLayout->addWidget(lblStatus, 1);
  76. bottomLayout->addWidget(btnQuit);
  77.  
  78. QVBoxLayout *mainLayout = new QVBoxLayout;
  79. mainLayout->addWidget(gbServerControl);
  80. mainLayout->addWidget(gbConnectedClient);
  81. mainLayout->addWidget(gbMessage);
  82. mainLayout->addLayout(bottomLayout);
  83. setLayout(mainLayout);
  84.  
  85. setWindowTitle(tr("TCP Chat Server - by Strife Low"));
  86. lePort->setFocus();
  87. }
  88.  
  89. Server::~Server()
  90. {
  91. }
  92.  
  93. void Server::sendToClients(const QByteArray& line)
  94. {
  95. foreach (QTcpSocket* connection, connections)
  96. {
  97. connection->write(line);
  98. }
  99. }
  100.  
  101. void Server::slotStartButtonEnable()
  102. {
  103. btnStart->setDisabled(false);
  104. }
  105.  
  106. void Server::slotStartClicked()
  107. {
  108. lblStatus->setText(tr("Server starting"));
  109. if (lePort->text() == "")
  110. {
  111. QMessageBox::critical(this, tr("Server"), tr("Please enter a valid port number"));
  112. return;
  113. }
  114. if (lePort->text().toInt() > 65535)
  115. {
  116. lePort->setText("65535");
  117. }
  118.  
  119. if (!tcpServer->listen(QHostAddress::Any, lePort->text().toInt())) {
  120. QMessageBox::critical(this, tr("Server"), tr("Unable to start the server: %1.").arg(tcpServer->errorString()));
  121. return;
  122. }
  123.  
  124. btnStart->setDisabled(true);
  125. btnStop->setDisabled(false);
  126. lePort->setDisabled(true);
  127. lblStatus->setText(tr("Server started at port %1").arg(tcpServer->serverPort()));
  128. }
  129.  
  130. void Server::slotStopClicked()
  131. {
  132. btnStart->setEnabled(true);
  133. btnStop->setEnabled(false);
  134. lePort->setDisabled(false);
  135.  
  136. if (tcpServer->isListening())
  137. {
  138. tcpServer->close();
  139. }
  140.  
  141. if (!connections.isEmpty())
  142. {
  143. foreach (QTcpSocket* connection, connections)
  144. {
  145. connection->close();
  146. }
  147. connections.clear();
  148. }
  149.  
  150. if (serverSocket->isValid())
  151. {
  152. serverSocket->close();
  153. }
  154. lblStatus->setText(tr("Server stopped"));
  155. }
  156.  
  157. void Server::slotNewClient()
  158. {
  159. if (!connections.isEmpty())
  160. {
  161. QByteArray msg = "New Client connected\n";
  162. foreach (QTcpSocket* connection, connections)
  163. {
  164. connection->write(msg);
  165. }
  166. }
  167.  
  168. serverSocket = tcpServer->nextPendingConnection();
  169. QStringList tmpClientAddressPort;
  170. tmpClientAddressPort << tr("%1").arg(serverSocket->peerAddress().toString()) << tr("%1").arg(serverSocket->peerPort());
  171. liClients.append(new QTreeWidgetItem(twClientConnected, tmpClientAddressPort));
  172.  
  173. //itemList.insert(serverSocket, (liClients.count() - 1));
  174. //tmpClientAddressPort.clear();
  175.  
  176. connections.append(serverSocket);
  177. QBuffer* buffer = new QBuffer(this);
  178. buffer->open(QIODevice::ReadWrite);
  179. buffers.insert(serverSocket, buffer);
  180. connect(serverSocket, SIGNAL(disconnected()), this, SLOT(slotClientDisconnected()));
  181. connect(serverSocket, SIGNAL(readyRead()), this, SLOT(slotSocketRead()));
  182. }
  183.  
  184. void Server::slotClientDisconnected()
  185. {
  186. QTcpSocket* socket = static_cast<QTcpSocket*>(sender());
  187. QBuffer* buffer = buffers.take(socket);
  188. buffer->close();
  189. buffer->deleteLater();
  190. connections.removeAll(socket);
  191. socket->deleteLater();
  192.  
  193. QByteArray msg = "Client disconnected\n";
  194. foreach (QTcpSocket* connection, connections)
  195. {
  196. connection->write(msg);
  197. }
  198. }
  199.  
  200. void Server::slotSocketRead()
  201. {
  202. QTcpSocket* socket = static_cast<QTcpSocket*>(sender());
  203. QBuffer* buffer = buffers.value(socket);
  204.  
  205. qint64 bytes = buffer->write(socket->readAll());
  206. buffer->seek(buffer->pos() - bytes);
  207.  
  208. while (buffer->canReadLine())
  209. {
  210. QByteArray line = buffer->readLine();
  211. sendToClients(line);
  212. teMessage->append(line);
  213. }
  214. }
  215.  
  216. // end of file
To copy to clipboard, switch view to plain text mode