我想在ws://echo.websocket.org
中打开一个qt websocket到测试服务,但我得到了错误QAbstractSocket::RemoteHostClosedError
我将信号error(QAbstractSocket::SocketError socketError)
连接到我代码中的一个插槽,以便读取错误编号,然后在这里查找
我的代码看起来像这个
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Controller w;
w.initializeWebSocket("ws://echo.websocket.org", true);
w.show();
return a.exec();
}
Controller::Controller(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
}
void Controller::initializeWebSocket(QString url, bool debug)
{
m_webSocketURL = url;
m_webSocketDebug = debug;
if(m_webSocketDebug)
std::cout << "WebSocket server: " << m_webSocketURL.toStdString() << std::endl;
QObject::connect(&m_webSocket, SIGNAL(connected()), this, SLOT(onConnected()));
QObject::connect(&m_webSocket, SIGNAL(disconnected()), this, SLOT(onDisconnected()));
QObject::connect(&m_webSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(onError(QAbstractSocket::SocketError)));
QObject::connect(&m_webSocket, SIGNAL(textMessageReceived(QString)), this, SLOT(onTextMessageReceived(QString)));
m_webSocket.open(QUrl(m_webSocketURL));
}
void Controller::onConnected()
{
if (m_webSocketDebug)
std::cout << "WebSocket connected" << std::endl;
m_webSocket.sendTextMessage(QStringLiteral("Rock it with HTML5 WebSocket"));
}
void Controller::onDisconnected()
{
if (m_webSocketDebug)
std::cout << "WebSocket disconnected" << std::endl;
}
void Controller::onError(QAbstractSocket::SocketError error)
{
std::cout << error << std::endl;
}
void Controller::onTextMessageReceived(QString message)
{
if (m_webSocketDebug)
std::cout << "Message received:" << message.toStdString() << std::endl;
m_webSocket.close();
}
我刚接触网络插座,所以我不知道问题出在哪里。有人能给我建议吗?
在"ws://echo.websocket.org"打开websocket对我来说很好。
这些处理程序在我的项目中已经足够了:
connect(&webSocket, SIGNAL(connected()), this, SLOT(onConnected()));
connect(&webSocket, SIGNAL(disconnected()), this, SLOT(onDisconnected()));
connect(&webSocket, SIGNAL(textMessageReceived(const QString&)), this, SLOT(onTextMessageReceived(const QString&)));
我也刚刚意识到,我不连接error()信号,但程序代码已经相当可靠一年多了,在断开连接的情况下,会有一个连接恢复启动。也许我也应该连接error(。
错误QAbstractSocket::RemoteHostClosedError可能是正确的。尽量在合理的时间内得到回声。我们在项目中使用的websocket场保持连接长达50分钟,因此我们在客户端和服务器之间进行乒乓球,以在这段时间到期之前保持连接。
// you can try that immediately after opening the web socket and also using some QTimer
m_webSocket.sendTextMessage("Pong!");
只要你在玩公共回声服务,就可以试试看短信回复。
好吧,我验证了您的代码,它似乎工作得很好。您给出的错误表示存在与主机相关的问题。这可能是由于防火墙、isp或其他阻塞/问题。
WebSocket server: ws://echo.websocket.org
WebSocket connected
Message received:Rock it with HTML5 WebSocket
WebSocket disconnected
我想指出的是,最好保留一个指向QWebSocket"对象"的指针。将m_webSocket
声明为QWebSocket *
并添加m_webSocket = new QWebSocket(this)
非常方便。将对象视为对象是一种很好的做法。您不想意外地直接"复制"QWebSocket。此外,由于Qt的内部结构,如果这个"Controller"对象被破坏,而QWebSocket仍然连接到其他对象,您最终可能会遇到问题(尽管我认为Qt已经做好了准备)。