DiagramDesigner/diagramCommunication/source/webSocketChannel.cpp

112 lines
2.9 KiB
C++

// WebSocketChannel.cpp
#include "webSocketChannel.h"
#include <QDebug>
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;
}
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(80); // 默认端口 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 连接
QWebSocket *socket = new QWebSocket();
socket->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);
}