QWebSocket Hello World Example
QWebSocket Hello World Example
我正在尝试在项目中使用 QWebSockets。我写了一个小的"Hello World"示例来测试它是如何工作的。问题:我可以启动 WebSocket 服务器,但客户端无法连接到它。我的客户端进入QAbstractSocket::ConnectingState,但从未真正连接过。
#if !defined(RAVI_SERVER_WEBSOCKETCLIENT_HPP)
#define RAVI_SERVER_WEBSOCKETCLIENT_HPP
//Qt includes
//WebSocket
#include <QtWebSockets/QWebSocketServer>
#include <QtWebSockets/QWebSocket>
//Util
#include <QObject>
#include <QDebug>
namespace ravi{
namespace server{
class WebSocketClient : public QObject{
public:
WebSocketClient(const QUrl &url, QObject* parent = nullptr);
private slots:
void handle_new_connection();
void handle_close_connection();
void handle_new_text_message();
void handle_ssl_errors(const QList<QSslError> &errors);
QWebSocket _socket;
};
}
}
#endif // RAVI_SERVER_WEBSOCKETCLIENT_HPP
#include "WebSocketClient.hpp"
ravi::server::WebSocketClient::WebSocketClient(const QUrl &url, QObject* parent):
QObject(parent),
_socket(){
connect(&_socket, QOverload<QAbstractSocket::SocketError>::of(&QWebSocket::error),
[=](QAbstractSocket::SocketError error){
qDebug() << "Error";
});
connect(&_socket, &QWebSocket::connected, this, &WebSocketClient::handle_new_connection);
connect(&_socket, &QWebSocket::disconnected, this, &WebSocketClient::handle_close_connection);
connect(&_socket, QOverload<const QList<QSslError>&>::of(&QWebSocket::sslErrors),
this, &WebSocketClient::handle_ssl_errors);
qDebug() << url.path();
qDebug() << url.port();
qDebug() << url.url();
qDebug() << url.host();
_socket.open(url);
qDebug() << _socket.state();
}
void ravi::server::WebSocketClient::handle_new_connection(){
qDebug() << "New Connection";
_socket.sendTextMessage(QStringLiteral("Hello, world!"));
connect(&_socket, &QWebSocket::textMessageReceived,
this, &WebSocketClient::handle_new_text_message);
}
void ravi::server::WebSocketClient::handle_close_connection(){
qDebug() << "Closed Connection";
}
void ravi::server::WebSocketClient::handle_new_text_message(){
qDebug() << "New Text Message";
}
void ravi::server::WebSocketClient::handle_ssl_errors(const QList<QSslError> &errors){
Q_UNUSED(errors);
qDebug() << "SSL";
_socket.ignoreSslErrors();
}
#include "source/server/WebSocketClient.hpp"
#include <iostream>
int main(int argc, char const *argv[])
{
ravi::server::WebSocketClient(QUrl("ws://127.0.0.1:8888"));
std::string line;
std::getline(std::cin, line);
}
#if !defined(RAVI_SERVER_WEBSOCKETSERVER_HPP)
#define RAVI_SERVER_WEBSOCKETSERVER_HPP
//Qt includes
//WebSocket
#include <QtWebSockets/QWebSocketServer>
#include <QtWebSockets/QWebSocket>
//Util
#include <QObject>
#include <QDebug>
namespace ravi{
namespace server{
class WebSocketServer : public QObject{
Q_OBJECT
public:
WebSocketServer(int port, QObject* parent = nullptr);
private:
void handle_new_connection();
void handle_close_connection();
void handle_text_message();
void handle_binary_message();
void handle_disconnect();
QWebSocketServer* _ws_server;
std::vector<QWebSocket*> _clients;
};
}
}
#endif // RAVI_SERVER_WEBSOCKETSERVER_HPP
#include "WebSocketServer.hpp"
ravi::server::WebSocketServer::WebSocketServer(int port, QObject* parent):
QObject(parent),
_ws_server(new QWebSocketServer("WebSocket Server", QWebSocketServer::NonSecureMode, this)){
if(_ws_server->listen(QHostAddress::Any, port)){
qDebug() << "Connect handlers";
connect(_ws_server, &QWebSocketServer::newConnection, this, &WebSocketServer::handle_new_connection);
connect(_ws_server, &QWebSocketServer::closed, this, &WebSocketServer::handle_close_connection);
}
if(_ws_server->isListening()){
qDebug() << "Still Listening";
}
}
void ravi::server::WebSocketServer::handle_new_connection(){
qDebug() << "New Connection";
QWebSocket *client = _ws_server->nextPendingConnection();
connect(client, &QWebSocket::textMessageReceived, this, &WebSocketServer::handle_text_message);
connect(client, &QWebSocket::binaryMessageReceived, this, &WebSocketServer::handle_binary_message);
connect(client, &QWebSocket::disconnected, this, &WebSocketServer::handle_disconnect);
_clients.push_back(client);
}
void ravi::server::WebSocketServer::handle_close_connection(){
qDebug() << "Closed Connection";
}
void ravi::server::WebSocketServer::handle_text_message(){
}
void ravi::server::WebSocketServer::handle_binary_message(){
}
void ravi::server::WebSocketServer::handle_disconnect(){
}
#include "source/server/WebSocketServer.hpp"
#include <iostream>
int main(int argc, char const *argv[])
{
auto ws_server = ravi::server::WebSocketServer(8888);
std::string line;
std::getline(std::cin, line);
return 0;
}
我看不出我做错了什么。从我的角度来看,这应该有效(绝地武士是邪恶的(。 希望有任何帮助或链接到已经涵盖的条目,我找不到任何帮助或链接。
您有 2 个错误:
- 如果不将客户端对象分配给变量,则立即将其销毁。
- Qt需要一个事件循环来使信号、事件等工作,在这种情况下,一个QCoreApplication就足够了。
#include "source/server/WebSocketClient.hpp"
#include <QCoreApplication>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
ravi::server::WebSocketClient client(QUrl("ws://127.0.0.1:8888"));
return a.exec();
}
#include "source/server/WebSocketServer.hpp"
#include <QCoreApplication>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
ravi::server::WebSocketServer server(8888);
return a.exec();
}
另一方面,我觉得奇怪的是auto ws_server = ravi::server::WebSocketServer(8888);
不会生成编译错误,因为作为 WebSocketServer QObject 不应该允许复制构造函数。
相关文章:
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- Qt focusObjectChanged example?
- 无法编译wxWidgets Hello World
- 运行命令 "rosbag play example.bag" 时出错。找不到与插件 rosbag/NoEncryptor 对应的库
- 简单C++"Hello World"程序的执行时间长
- 使用 AWS Lambda 触发C++文件 - Hello World
- 使用 Visual Studio 2019 构建 Hello World wxwidgets 应用程序时出错
- 我怎样才能在行尾使用 cout<<"hello world";不使用 ;
- QWebSocket Hello World Example
- 为什么下面的Hello World程序在PowerShell上没有显示任何输出?同一程序在CMD上显示正确的输出
- Box2D World.GetBodyList() 返回 NULL,但 World 显然正在更新对象
- 我需要安装什么才能获得在Windows Server 2012 R2 Standard上运行C++hello world
- 运行Qt时处理退出代码0xC0000135 hello world
- 如何使用CLion和MSVC编译器工具链编译wxWidgets Hello World应用程序而没有错误?
- 为什么 MSVC C++编译器将一个简单的 Hello World 扩展为 4000 行汇编?
- 为什么'Hello'与CPP中的'World'进行比较时被打印出来?
- c++ Doxygen example and description
- 无法运行简单的N-API hello-world示例
- 如何使用python运行Hello world c ++代码
- Example of CDocument::ReleaseFile for MFC