DiagramDesigner/diagramCommunication/source/webSocketChannel.cpp

124 lines
3.2 KiB
C++
Raw Normal View History

2025-12-12 17:46:37 +08:00
// WebSocketChannel.cpp
#include "webSocketChannel.h"
#include <QDebug>
2025-12-19 18:28:13 +08:00
WebSocketChannel::WebSocketChannel(const ChannelConfig& config, QString sessionId, QObject* parent)
2025-12-12 17:46:37 +08:00
: BaseChannel(config, parent)
, m_webSocket(new QWebSocket)
{
QObject::connect(m_webSocket, &QWebSocket::connected,
this, &WebSocketChannel::onConnected);
QObject::connect(m_webSocket, &QWebSocket::disconnected,
this, &WebSocketChannel::onDisconnected);
QObject::connect(m_webSocket, &QWebSocket::textMessageReceived,
this, &WebSocketChannel::onTextMessageReceived);
QObject::connect(m_webSocket, &QWebSocket::binaryMessageReceived,
this, &WebSocketChannel::onBinaryMessageReceived);
2025-12-19 18:28:13 +08:00
m_sessionId = sessionId;
2025-12-12 17:46:37 +08:00
}
2025-12-25 09:03:35 +08:00
WebSocketChannel::~WebSocketChannel()
{
if(m_webSocket){
m_webSocket->disconnect();
if (m_webSocket->state() == QAbstractSocket::ConnectedState) {
m_webSocket->close();
}
m_webSocket->deleteLater();
m_webSocket = nullptr;
}
}
2025-12-12 17:46:37 +08:00
bool WebSocketChannel::connect()
{
if (m_webSocket->state() == QAbstractSocket::ConnectedState) {
return true;
}
if (!m_config.endpoint.isValid()) {
emit errorOccurred("Invalid endpoint");
return false;
}
2025-12-19 18:28:13 +08:00
// 1. 从 WebSocket URL 提取 host 和 port
QUrl url(m_config.endpoint);
2025-12-25 09:03:35 +08:00
//QString host = url.host();
//int port = url.port(10080); // 默认端口 80
2025-12-19 18:28:13 +08:00
// 2. 构建 Origin URL
2025-12-25 09:03:35 +08:00
//QString origin = QString("http://%1:%2").arg(host).arg(port);
2025-12-19 18:28:13 +08:00
// 3. 创建 QNetworkRequest 并设置 Origin
QNetworkRequest request(url);
2025-12-25 09:03:35 +08:00
//request.setRawHeader("Origin", origin.toUtf8());
2025-12-19 18:28:13 +08:00
// 4. 使用 QWebSocket 连接
2025-12-25 09:03:35 +08:00
m_webSocket->open(request);
2025-12-19 18:28:13 +08:00
qDebug() << "WebSocket URL:" << m_config.endpoint;
2025-12-25 09:03:35 +08:00
//qDebug() << "Origin:" << origin;
2025-12-12 17:46:37 +08:00
return true;
}
bool WebSocketChannel::disconnect()
{
if (m_webSocket->state() != QAbstractSocket::UnconnectedState) {
m_webSocket->close();
}
return true;
}
bool WebSocketChannel::isConnected() const
{
return m_webSocket->state() == QAbstractSocket::ConnectedState;
}
bool WebSocketChannel::send(const QByteArray& data)
{
if (!isConnected()) {
emit errorOccurred("WebSocket not connected");
return false;
}
qint64 sent = m_webSocket->sendBinaryMessage(data);
return sent == data.size();
}
bool WebSocketChannel::sendText(const QString& text)
{
if (!isConnected()) {
emit errorOccurred("WebSocket not connected");
return false;
}
qint64 sent = m_webSocket->sendTextMessage(text);
return sent == text.size();
}
void WebSocketChannel::setWebSocketConfig(const WebSocketConfig& config)
{
m_wsConfig = config;
}
void WebSocketChannel::onConnected()
{
2025-12-19 18:28:13 +08:00
emit connected(m_sessionId);
2025-12-12 17:46:37 +08:00
}
void WebSocketChannel::onDisconnected()
{
2025-12-19 18:28:13 +08:00
emit disconnected(m_sessionId);
2025-12-12 17:46:37 +08:00
}
void WebSocketChannel::onTextMessageReceived(const QString& message)
{
2025-12-19 18:28:13 +08:00
emit textMessageReceived(message,m_sessionId);
emit dataReceived(message.toUtf8(),m_sessionId);
2025-12-12 17:46:37 +08:00
}
void WebSocketChannel::onBinaryMessageReceived(const QByteArray& message)
{
2025-12-19 18:28:13 +08:00
emit dataReceived(message,m_sessionId);
2025-12-12 17:46:37 +08:00
}