1
0

WebSocketClientPage.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. #include "WebSocketClientPage.h"
  2. #include "customevent.h"
  3. #include <QApplication>
  4. #include <QBoxLayout>
  5. #include "mainwindow.h"
  6. WebSocketClientPage::WebSocketClientPage(QWidget *parent) : QWidget(parent)
  7. {
  8. client = nullptr;
  9. initUI();
  10. initConnect();
  11. }
  12. WebSocketClientPage::~WebSocketClientPage()
  13. {
  14. close();
  15. }
  16. void WebSocketClientPage::initUI()
  17. {
  18. QHBoxLayout* hbox = new QHBoxLayout;
  19. // url
  20. hbox->addWidget(new QLabel("url:"));
  21. urlEdt = new QLineEdit("ws://127.0.0.1:8080/echo");
  22. hbox->addWidget(urlEdt);
  23. // open
  24. openBtn = new QPushButton("open");
  25. hbox->addWidget(openBtn);
  26. // close
  27. closeBtn = new QPushButton("close");
  28. closeBtn->setEnabled(false);
  29. hbox->addWidget(closeBtn);
  30. setLayout(hbox);
  31. }
  32. void WebSocketClientPage::initConnect()
  33. {
  34. connect(openBtn, &QPushButton::clicked, [this]() {
  35. std::string url = urlEdt->text().toStdString();
  36. if (open(url.c_str())) {
  37. openBtn->setEnabled(false);
  38. closeBtn->setEnabled(true);
  39. g_mainwnd->appendMessage(QString::asprintf("WS client openning to %s ...", url.c_str()));
  40. } else {
  41. g_mainwnd->appendMessage(QString::asprintf("WS client open failed!"));
  42. }
  43. });
  44. connect(closeBtn, &QPushButton::clicked, [this]() {
  45. close();
  46. openBtn->setEnabled(true);
  47. closeBtn->setEnabled(false);
  48. g_mainwnd->appendMessage("WS client closing ...");
  49. });
  50. }
  51. void WebSocketClientPage::customEvent(QEvent* e)
  52. {
  53. switch(e->type())
  54. {
  55. case qEventRecvMsg:
  56. {
  57. QStringEvent* event = dynamic_cast<QStringEvent*>(e);
  58. g_mainwnd->appendMessage(event->message);
  59. }
  60. e->accept();
  61. break;
  62. case qEventOpened:
  63. {
  64. QStringEvent* event = dynamic_cast<QStringEvent*>(e);
  65. openBtn->setEnabled(false);
  66. closeBtn->setEnabled(true);
  67. g_mainwnd->appendMessage(event->message);
  68. }
  69. e->accept();
  70. break;
  71. case qEventClosed:
  72. {
  73. QStringEvent* event = dynamic_cast<QStringEvent*>(e);
  74. openBtn->setEnabled(true);
  75. closeBtn->setEnabled(false);
  76. g_mainwnd->appendMessage(event->message);
  77. }
  78. e->accept();
  79. break;
  80. default:
  81. break;
  82. }
  83. }
  84. bool WebSocketClientPage::open(const char* url)
  85. {
  86. client = new hv::WebSocketClient;
  87. client->onopen = [this]() {
  88. QStringEvent* event = new QStringEvent("WS client opened!", qEventOpened);
  89. QApplication::postEvent(this, event);
  90. };
  91. client->onclose = [this]() {
  92. QStringEvent* event = new QStringEvent("WS client closed!", qEventClosed);
  93. QApplication::postEvent(this, event);
  94. };
  95. client->onmessage = [](const std::string& msg) {
  96. g_mainwnd->postMessage(QString("< ") + QString::fromStdString(msg));
  97. };
  98. return client->open(url) == 0;
  99. }
  100. void WebSocketClientPage::close()
  101. {
  102. SAFE_DELETE(client);
  103. }
  104. int WebSocketClientPage::send(const QString& msg)
  105. {
  106. if (client == nullptr || !client->isConnected()) {
  107. g_mainwnd->postMessage("Please open first!");
  108. return -1;
  109. }
  110. return client->send(msg.toStdString());
  111. }