1
0

TcpServerPage.cpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. #include "TcpServerPage.h"
  2. #include <QBoxLayout>
  3. #include "mainwindow.h"
  4. TcpServerPage::TcpServerPage(QWidget *parent) : QWidget(parent)
  5. {
  6. server = nullptr;
  7. initUI();
  8. initConnect();
  9. }
  10. TcpServerPage::~TcpServerPage()
  11. {
  12. stop();
  13. }
  14. void TcpServerPage::initUI()
  15. {
  16. QHBoxLayout* hbox = new QHBoxLayout;
  17. // host
  18. hbox->addWidget(new QLabel("host:"));
  19. hostEdt = new QLineEdit("0.0.0.0");
  20. hbox->addWidget(hostEdt);
  21. // port
  22. hbox->addWidget(new QLabel("port:"));
  23. portEdt = new QLineEdit("1234");
  24. hbox->addWidget(portEdt);
  25. // start
  26. startBtn = new QPushButton("start");
  27. hbox->addWidget(startBtn);
  28. // stop
  29. stopBtn = new QPushButton("stop");
  30. stopBtn->setEnabled(false);
  31. hbox->addWidget(stopBtn);
  32. setLayout(hbox);
  33. }
  34. void TcpServerPage::initConnect()
  35. {
  36. connect(startBtn, &QPushButton::clicked, [this]() {
  37. std::string host = hostEdt->text().toStdString();
  38. int port = portEdt->text().toInt();
  39. if (start(port, host.c_str())) {
  40. startBtn->setEnabled(false);
  41. stopBtn->setEnabled(true);
  42. g_mainwnd->appendMessage(QString::asprintf("TCP server running on %s:%d ...", host.c_str(), port));
  43. } else {
  44. g_mainwnd->appendMessage(QString::asprintf("TCP server start failed!"));
  45. }
  46. });
  47. connect(stopBtn, &QPushButton::clicked, [this]() {
  48. stop();
  49. startBtn->setEnabled(true);
  50. stopBtn->setEnabled(false);
  51. g_mainwnd->appendMessage("TCP server stopped!");
  52. });
  53. }
  54. bool TcpServerPage::start(int port, const char* host)
  55. {
  56. server = new hv::TcpServer;
  57. int listenfd = server->createsocket(port, host);
  58. if (listenfd < 0) {
  59. return false;
  60. }
  61. server->setThreadNum(1);
  62. server->onConnection = [](const hv::SocketChannelPtr& channel) {
  63. std::string peeraddr = channel->peeraddr();
  64. if (channel->isConnected()) {
  65. g_mainwnd->postMessage(QString::asprintf("%s connected! connfd=%d", peeraddr.c_str(), channel->fd()));
  66. } else {
  67. g_mainwnd->postMessage(QString::asprintf("%s disconnected! connfd=%d", peeraddr.c_str(), channel->fd()));
  68. }
  69. };
  70. server->onMessage = [](const hv::SocketChannelPtr& channel, hv::Buffer* buf) {
  71. g_mainwnd->postMessage(QString::asprintf("< %.*s", (int)buf->size(), (char*)buf->data()));
  72. // echo
  73. channel->write(buf);
  74. };
  75. server->start();
  76. return true;
  77. }
  78. void TcpServerPage::stop()
  79. {
  80. SAFE_DELETE(server);
  81. }