2011-04-15 22 views
13

¿Hay un ejemplo de WebSockets para Qt?¿Hay un ejemplo de WebSockets para Qt?

+2

@charles: Por favor no quitar las etiquetas correspondientes, si usted no tiene más relevante. Además, perdimos toda esa información tagwiki ahora. Tenga más cuidado la próxima vez. Qt y websockets significan casi QtWebsockets en estos días, ya que se convirtió en parte de Qt propiamente dicha. Incluso si no fue así, hay una meta discusión sobre si está bien agregar etiquetas basadas en las respuestas relevantes. – lpapp

+0

@FinalContest, las etiquetas son para * preguntas *, no respuestas. Esta es ** no ** una pregunta sobre una biblioteca específica mencionada en una respuesta, es una pregunta sobre websockets en Qt. – Charles

+0

@FinalContest, no estoy diciendo que la etiqueta no debería existir, estoy diciendo que tener ** esta ** pregunta es ** la ** única con la etiqueta no es apropiada. Esta es una pregunta de recomendación de la biblioteca de todos modos, y por lo tanto está fuera del tema. Hay [al menos algunas] (http://stackoverflow.com/search?q=qtwebsocket) otras preguntas que la etiqueta podría y * probablemente debería * existir. La edición sucedió hace tanto tiempo que no recuerdo si existieron en ese momento. – Charles

Respuesta

1

QWebView dentro de QtWebKit admite el uso de Web Sockets (del estándar HTML5). Los he usado varias veces sin ningún problema.

+4

¿Puede posiblemente compartir el código fuente para que los novatos comencemos? – BRampersad

3

También puede echar un vistazo a QtWebSockets. QtWebSockets se puede usar tanto para aplicaciones de cliente como de servidor y pasa el conjunto de pruebas de Autobahn.

0

He creado un ejemplo. Aquí está el código:

inspection_server.hpp:

#ifndef __INSPECTION_SERVER_HPP__ 
#define __INSPECTION_SERVER_HPP__ 

#include <QWebSocketServer> 
#include <QWebSocket> 
#include <QObject> 
#include <iostream> 
#include <memory> 

class InspectionServer; 

typedef std::shared_ptr<QWebSocketServer> QWebSocketServerPtr; 
typedef std::shared_ptr<QWebSocket> QWebSocketPtr; 
typedef std::shared_ptr<InspectionServer> InspectionServerPtr; 

class InspectionServer: public QObject 
{ 
    Q_OBJECT 

    QWebSocketServerPtr websocketServer; 
    QList<QWebSocketPtr> clients; 

public: 
    InspectionServer(uint16_t port); 

signals: 
    void closed(); 

private slots: 
    void onNewConnection(); 
    void processTextMessage(const QString& message); 
    void socketDisconnected(); 

}; 

#endif 

inspection_server.cpp:

#include "inspection_server.hpp" 

#include <QDebug> 

InspectionServer::InspectionServer(uint16_t port) 
    : websocketServer(new QWebSocketServer(QStringLiteral("Inspection server"), QWebSocketServer::NonSecureMode)) 
{ 
    if(this->websocketServer->listen(QHostAddress::Any, port)) 
    { 
     QObject::connect(websocketServer.get(), SIGNAL(newConnection()), this, SLOT(onNewConnection())); 
    } 
    else 
    { 
     throw std::runtime_error("InspectionServer: failed to listen"); 
    } 
} 

void InspectionServer::onNewConnection() 
{ 
    qInfo() << "InspectionServer::onNewConnection"; 
    QWebSocketPtr socket(this->websocketServer->nextPendingConnection()); 

    QObject::connect(socket.get(), SIGNAL(textMessageReceived(const QString&)), this, SLOT(processTextMessage(const QString&))); 
    QObject::connect(socket.get(), SIGNAL(disconnected()), this, SLOT(socketDisconnected())); 

    this->clients.append(socket); 
} 

void InspectionServer::processTextMessage(const QString& message) 
{ 
    qInfo() << "InspectionServer::processTextMessage: " << message; 
} 

void InspectionServer::socketDisconnected() 
{ 
    qInfo() << "InspectionServer::socketDisconnected"; 
} 

main.cpp:

#include "inspection_server.hpp" 

#include <QCoreApplication> 

int main(int argc, char** argv) 
{ 
    QCoreApplication app(argc, argv); 

    InspectionServer server(1234); 

    return app.exec(); 
} 

Y aquí es cómo probar que, en su navegador web:

<html> 
<body> 
<button onClick="initWebSocket();">Connect</button> 
<br> 
<input type="text" id="messageInput"> 
<button onClick="sendMessage();">Send message</button> 
</body> 
</html> 

<script type="text/javascript"> 

var websocket = null; 

function initWebSocket() 
{ 
    websocket = new WebSocket("ws://localhost:1234"); 
} 

function sendMessage() 
{ 
    websocket.send(document.getElementById("messageInput").value); 
} 

</script> 

Este es un buen enlace para referencia: http://code.qt.io/cgit/qt/qtwebsockets.git/tree/examples/websockets/echoserver

Cuestiones relacionadas