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
|
|
|
}
|