基于websocket的简单通信
首次接觸websocket通信協議,不足之處希望指出一起進步。
簡述
websocket是基于tcp協議的一種網絡通信協議,分為客戶端和服務端,可以實現客戶端與服務端的雙向通信。
與tcp的不同之處是:
1.客戶端與服務端只需要一次握手協議,就可以建立比較持久的網絡連接;
2.客戶端不需要向服務端發送連接請求。
服務端監聽指定的端口之后,客戶端只需打開服務端的url,就可建立連接。
簡單的項目實例
項目簡述
在客戶端與服務端建立連接的情況下,服務端向客戶端發送json字符串,客戶端接收到json字符串并顯示,客戶端一旦收到二進制消息,服務端接收來自客戶端的文本消息,并向客戶端發送文本消息。
項目運行效果圖
服務端運行效果:
客戶端運行效果:
項目源碼
客戶端
main.cpp
dialog.h
#ifndef DIALOG_H #define DIALOG_H#include <QDialog> #include <QtWebSockets/QWebSocket>QT_BEGIN_NAMESPACE namespace Ui { class Dialog; } QT_END_NAMESPACEclass Dialog : public QDialog {Q_OBJECTpublic:Dialog(QWidget *parent = nullptr);~Dialog();void createWebsocket();public slots:void slot_onConnected();void slot_onDisconnected();void slot_onTextMsgRecevied(const QString &msg);void slot_onBinaryMessageReceived(const QByteArray &message);void slot_onError(QAbstractSocket::SocketError error);private:Ui::Dialog *ui;QWebSocket *m_client; }; #endif // DIALOG_Hdialog.cpp
#include "dialog.h" #include "ui_dialog.h"Dialog::Dialog(QWidget *parent): QDialog(parent), ui(new Ui::Dialog) {ui->setupUi(this);setWindowTitle(tr("Client")); }Dialog::~Dialog() {delete ui; }void Dialog::createWebsocket() {m_client = new QWebSocket();m_client->open(QUrl("ws://localhost:6666"));connect(m_client, &QWebSocket::connected, this, &Dialog::slot_onConnected);connect(m_client, &QWebSocket::disconnected, this, &Dialog::slot_onDisconnected);connect(m_client, &QWebSocket::binaryMessageReceived,this, &Dialog::slot_onBinaryMessageReceived);connect(m_client, &QWebSocket::textMessageReceived,this, &Dialog::slot_onTextMsgRecevied);connect(m_client,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(slot_onError(QAbstractSocket::SocketError))); }void Dialog::slot_onConnected() { // connect(m_client, &QWebSocket::binaryMessageReceived,this, Dialog::slot_onTextMsgRecevied); // connect(m_client, &QWebSocket::textMessageReceived,this, Dialog::slot_onTextMsgRecevied);m_client->sendTextMessage(QStringLiteral("Hello,server!我連接你成功了")); }void Dialog::slot_onDisconnected() {m_client->close();if(m_client != NULL){delete m_client;m_client = NULL;} }void Dialog::slot_onTextMsgRecevied(const QString &msg) {ui->plainTextEdit->appendPlainText(msg); }void Dialog::slot_onBinaryMessageReceived(const QByteArray &message) {std::string strMsg = message.toStdString();//接收JSON字符串ui->plainTextEdit->appendPlainText(QString::fromStdString(strMsg)); }void Dialog::slot_onError(QAbstractSocket::SocketError error) {QTextStream(stdout)<<m_client->errorString(); }ui文件
客戶端項目結構
服務端
main.cpp
dialog.h
#ifndef DIALOG_H #define DIALOG_H#include <QDialog> #include <QtWebSockets/QWebSocketServer> #include <QtWebSockets/QWebSocket>QT_BEGIN_NAMESPACE namespace Ui { class Dialog; } QT_END_NAMESPACEclass Dialog : public QDialog {Q_OBJECTpublic:Dialog(QWidget *parent = nullptr);~Dialog();void createWebServer();QString getCurrFilePath(QString fileName);QByteArray readJsonConfigFile(QString &fileName);public slots:void slot_onNewConnection();void slot_processMessage(const QString &msg);void slot_socketDisconnected();void slot_binaryMessageReceived(const QByteArray &message); private:Ui::Dialog *ui;QWebSocketServer *m_serve;QWebSocket * m_client; }; #endif // DIALOG_Hdialog.cpp
#include "dialog.h" #include "ui_dialog.h" #include <QDebug> #include <QFile>Dialog::Dialog(QWidget *parent): QDialog(parent), ui(new Ui::Dialog) {ui->setupUi(this);setWindowTitle(tr("Server")); }Dialog::~Dialog() {if(m_serve != NULL){m_serve->close();//設置了父窗口,就不用delete}delete ui; }void Dialog::createWebServer() {m_serve = new QWebSocketServer("test1",QWebSocketServer::NonSecureMode,this);//非安全swm_serve->listen(QHostAddress::LocalHost,6666);connect(m_serve, &QWebSocketServer::newConnection, this, &Dialog::slot_onNewConnection); }void Dialog::slot_onNewConnection() {m_client = m_serve->nextPendingConnection();QString strFileName = getCurrFilePath("config2.json");QByteArray jsonArray = readJsonConfigFile(strFileName);m_client->sendBinaryMessage(jsonArray); // m_client->sendTextMessage("什么??客戶端你好!");connect(m_client,&QWebSocket::binaryMessageReceived,this,&Dialog::slot_binaryMessageReceived);connect(m_client, &QWebSocket::textMessageReceived,this, &Dialog::slot_processMessage);connect(m_client, &QWebSocket::disconnected,this, &Dialog::slot_socketDisconnected); }void Dialog::slot_processMessage(const QString &msg) {// m_client->sendTextMessage("客戶端,你收到消息了?");ui->textEdit->append(msg);m_client->sendTextMessage("客戶端,我收到你的消息了"); }void Dialog::slot_socketDisconnected() {m_client->close(); }void Dialog::slot_binaryMessageReceived(const QByteArray &message) {ui->textEdit->append(QString::fromLocal8Bit(message)); }QString Dialog::getCurrFilePath(QString fileName) {QString strFileName = QCoreApplication::applicationDirPath();//獲取可執行文件的路徑strFileName += "/" + fileName;return strFileName; }QByteArray Dialog::readJsonConfigFile(QString &fileName) {QByteArray allData;qDebug()<<"文件路徑及名稱:"<<fileName;QFile file(fileName);if (!file.open(QIODevice::ReadOnly)){qDebug()<<"json配置文件讀取失敗!";return allData;}allData = file.readAll();file.close();qDebug()<<"json文件內容:"<<allData;return allData; }ui文件
服務端項目結構
5. 總結
websocket在通信的過程中服務端的步驟:
(1)創建QWebSocketServer對象或著指向QWebSocketServer的指針,創建時需指明服務器的名稱,sslmode(即安全模式還是非安全模式,一般非SSL的情況下,采用的時非安全模式),另外還可以指明父窗口;
(2)監聽IP和端口;
(3)綁定信號與槽函數,涉及到的常用信號與槽的綁定有:
@1 newConnection(),與客戶端建立新的連接后觸發這個信號;
@2 serverError(QWebSocketProtocol::CloseCode closeCode),服務器發生錯誤時觸發該信號;
@3 可以在客戶端建立連接后,服務端綁定客戶端收到消息后的信號;
@4 可以在客戶端建立連接后,服務端綁定客戶端斷開連接的信號;
(4)關閉服務端連接。
websocket在通信的過程中客戶端的步驟:
(1)創建QWebSocket對象或著指向QWebSocket的指針;
(2)打開服務端的url;
(3)綁定信號與槽函數,常用的信號與槽函數的綁定如下:
@1 connected(),與服務端連接建立之后,信號被觸發;
@2 disconnected(),與服務端連接斷開之后,信號被觸發;
@3 textMessageReceived(const QString &message),有文本消息到來的時候,信號被觸發;
@4 binaryMessageReceived(const QByteArray &message),有二進制消息到來的時候,信號被觸發;
@5 error(QAbstractSocket::SocketError error),發生錯誤的時候信號被觸發;
6. 注意事項
(1).pro文件中添加QT += websockets,需加頭文件#include <QtWebSockets/QWebSocket>和#include <QtWebSockets/QWebSocketServer>。
總結
以上是生活随笔為你收集整理的基于websocket的简单通信的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言中规定的标准文件,标准C语言
- 下一篇: 折线图x轴的日期会超出_matplotl