// WebSocketChannel.cpp #include "webSocketChannel.h" #include WebSocketChannel::WebSocketChannel(const ChannelConfig& config, QString sessionId, QObject* parent) : 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); m_sessionId = sessionId; } WebSocketChannel::~WebSocketChannel() { if(m_webSocket){ m_webSocket->disconnect(); if (m_webSocket->state() == QAbstractSocket::ConnectedState) { m_webSocket->close(); } m_webSocket->deleteLater(); m_webSocket = nullptr; } } bool WebSocketChannel::connect() { if (m_webSocket->state() == QAbstractSocket::ConnectedState) { return true; } if (!m_config.endpoint.isValid()) { emit errorOccurred("Invalid endpoint"); return false; } // 1. 从 WebSocket URL 提取 host 和 port QUrl url(m_config.endpoint); //QString host = url.host(); //int port = url.port(10080); // 默认端口 80 // 2. 构建 Origin URL //QString origin = QString("http://%1:%2").arg(host).arg(port); // 3. 创建 QNetworkRequest 并设置 Origin QNetworkRequest request(url); //request.setRawHeader("Origin", origin.toUtf8()); // 4. 使用 QWebSocket 连接 m_webSocket->open(request); qDebug() << "WebSocket URL:" << m_config.endpoint; //qDebug() << "Origin:" << origin; 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() { emit connected(m_sessionId); } void WebSocketChannel::onDisconnected() { emit disconnected(m_sessionId); } void WebSocketChannel::onTextMessageReceived(const QString& message) { emit textMessageReceived(message,m_sessionId); emit dataReceived(message.toUtf8(),m_sessionId); } void WebSocketChannel::onBinaryMessageReceived(const QByteArray& message) { emit dataReceived(message,m_sessionId); }