Qt5 WebSocket测试应用程序未连接到测试服务

Qt5 WebSocket测试应用程序未连接到测试服务,qt,qtwebsockets,Qt,Qtwebsockets,我想在ws://echo.websocket.org中打开一个qt websocket到测试服务,但我得到了错误QAbstractSocket::RemoteHostClosedError 我正在将信号error(QAbstractSocket::SocketError SocketError)连接到代码中的一个插槽,以便读取错误号,然后查找它 我的代码如下所示 int main(int argc, char *argv[]) { QApplication a(argc, argv);

我想在
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();
}
intmain(intargc,char*argv[])
{
质量保证申请a(argc、argv);
控制器w;
w、 初始化websocket(“ws://echo.websocket.org”,true);
w、 show();
返回a.exec();
}
控制器::控制器(QWidget*父级)
:QMainWindow(父级)
{
ui.setupUi(这个);
}
void Controller::initializeWebSocket(QString url,bool debug)
{
m_webSocketURL=url;
m_webSocketDebug=调试;
如果(m_webSocketDebug)
std::cout在“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(此)
。将对象视为对象是一种很好的做法。您不希望意外地尝试直接“复制”QWebSocket。此外,由于Qt的内部结构,如果在QWebSocket仍然连接到其他对象的情况下销毁此“控制器”对象,您可能最终会遇到问题(尽管我认为Qt已经做好了准备).

另外,在Qt项目中使用:qDebug()我刚刚在另一台具有不同网络的计算机上试用过,它似乎工作正常。需要检查另一端的情况!