2011-04-15 3 views
13

Existe-t-il un exemple de WebSockets pour Qt?Existe-t-il un exemple de WebSockets pour Qt?

+2

@charles: s'il vous plaît ne pas retirer les étiquettes pertinentes si vous n'avez pas plus pertinent. En outre, nous avons perdu toutes les informations tagwiki maintenant. S'il vous plaît soyez plus prudent la prochaine fois. Qt et websockets signifient à peu près QtWebsockets ces jours-ci comme il est devenu une partie de Qt proprement dite. Même si ce n'était pas le cas, il y a une discussion méta sur le fait d'être OK pour ajouter des tags basés sur les réponses pertinentes. – lpapp

+0

@FinalContest, les balises sont pour * questions *, pas de réponses. Ce n'est pas ** une question sur une bibliothèque spécifique mentionnée dans une réponse, c'est une question à propos de websockets dans Qt. – Charles

+0

@FinalContest, je ne dis pas que la balise ne devrait pas exister, je dis qu'ayant ** cette ** question soit la ** seule ** une avec l'étiquette n'est pas appropriée. C'est une question de recommandation de bibliothèque de toute façon, et est donc hors sujet. Il y a [au moins un peu] (http://stackoverflow.com/search?q=qtwebsocket) d'autres questions sur lesquelles le tag pourrait et devrait probablement exister. Le montage s'est passé il y a si longtemps que je ne me souviens pas s'ils existaient à l'époque. – Charles

Répondre

1

QWebView à l'intérieur de QtWebKit prend en charge l'utilisation de Web Sockets (à partir de la norme HTML5). Je les ai utilisés plusieurs fois sans problème.

+4

Pouvez-vous éventuellement partager le code source pour nous les débutants a commencé? – BRampersad

3

Vous pouvez également regarder QtWebSockets. QtWebSockets peut être utilisé à la fois pour les applications client et serveur, et passe la suite de tests Autobahn.

0

J'ai créé un exemple. Voici le code:

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(); 
} 

Et voici comment tester dans votre navigateur 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> 

Ceci est un bon lien pour référence: http://code.qt.io/cgit/qt/qtwebsockets.git/tree/examples/websockets/echoserver