TcpClientPage.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. #include "TcpClientPage.h"
  2. #include "customevent.h"
  3. #include <QApplication>
  4. #include <QBoxLayout>
  5. #include "mainwindow.h"
  6. TcpClientPage::TcpClientPage(QWidget *parent) : QWidget(parent)
  7. {
  8. client = nullptr;
  9. initUI();
  10. initConnect();
  11. }
  12. TcpClientPage::~TcpClientPage()
  13. {
  14. close();
  15. }
  16. void TcpClientPage::initUI()
  17. {
  18. QHBoxLayout* hbox = new QHBoxLayout;
  19. // host
  20. hbox->addWidget(new QLabel("host:"));
  21. hostEdt = new QLineEdit("127.0.0.1");
  22. hbox->addWidget(hostEdt);
  23. // port
  24. hbox->addWidget(new QLabel("port:"));
  25. portEdt = new QLineEdit("1234");
  26. hbox->addWidget(portEdt);
  27. // connect
  28. connectBtn = new QPushButton("connect");
  29. hbox->addWidget(connectBtn);
  30. // close
  31. closeBtn = new QPushButton("close");
  32. closeBtn->setEnabled(false);
  33. hbox->addWidget(closeBtn);
  34. setLayout(hbox);
  35. }
  36. void TcpClientPage::initConnect()
  37. {
  38. QObject::connect(connectBtn, &QPushButton::clicked, [this]() {
  39. std::string host = hostEdt->text().toStdString();
  40. int port = portEdt->text().toInt();
  41. if (connect(port, host.c_str())) {
  42. connectBtn->setEnabled(false);
  43. closeBtn->setEnabled(true);
  44. g_mainwnd->appendMessage(QString::asprintf("TCP client connecting to %s:%d ...", host.c_str(), port));
  45. } else {
  46. g_mainwnd->appendMessage(QString::asprintf("TCP client connect failed!"));
  47. }
  48. });
  49. QObject::connect(closeBtn, &QPushButton::clicked, [this]() {
  50. close();
  51. connectBtn->setEnabled(true);
  52. closeBtn->setEnabled(false);
  53. g_mainwnd->appendMessage("TCP client closing ...");
  54. });
  55. }
  56. void TcpClientPage::customEvent(QEvent* e)
  57. {
  58. switch(e->type())
  59. {
  60. case qEventRecvMsg:
  61. {
  62. QStringEvent* event = dynamic_cast<QStringEvent*>(e);
  63. g_mainwnd->appendMessage(event->message);
  64. }
  65. e->accept();
  66. break;
  67. case qEventConnected:
  68. {
  69. QStringEvent* event = dynamic_cast<QStringEvent*>(e);
  70. connectBtn->setEnabled(false);
  71. closeBtn->setEnabled(true);
  72. g_mainwnd->appendMessage(event->message);
  73. }
  74. e->accept();
  75. break;
  76. case qEventDisconnected:
  77. {
  78. QStringEvent* event = dynamic_cast<QStringEvent*>(e);
  79. connectBtn->setEnabled(true);
  80. closeBtn->setEnabled(false);
  81. g_mainwnd->appendMessage(event->message);
  82. }
  83. e->accept();
  84. break;
  85. default:
  86. break;
  87. }
  88. }
  89. bool TcpClientPage::connect(int port, const char *host)
  90. {
  91. client = new hv::TcpClient;
  92. int connfd = client->createsocket(port, host);
  93. if (connfd < 0) {
  94. return false;
  95. }
  96. client->onConnection = [this](const hv::SocketChannelPtr& channel) {
  97. QStringEvent* event;
  98. if (channel->isConnected()) {
  99. event = new QStringEvent(QString::asprintf("TCP client connected! connfd=%d", channel->fd()), qEventConnected);
  100. } else {
  101. event = new QStringEvent(QString::asprintf("TCP client disconnected! connfd=%d", channel->fd()), qEventDisconnected);
  102. }
  103. QApplication::postEvent(this, event);
  104. };
  105. client->onMessage = [](const hv::SocketChannelPtr& channel, hv::Buffer* buf) {
  106. g_mainwnd->postMessage(QString::asprintf("< %.*s", (int)buf->size(), (char*)buf->data()));
  107. };
  108. client->start();
  109. return true;
  110. }
  111. void TcpClientPage::close()
  112. {
  113. if (client) {
  114. client->stop(true);
  115. }
  116. SAFE_DELETE(client);
  117. }
  118. int TcpClientPage::send(const QString& msg)
  119. {
  120. if (client == nullptr || !client->isConnected()) {
  121. g_mainwnd->postMessage("Please connect first!");
  122. return -1;
  123. }
  124. return client->send(msg.toStdString());
  125. }