首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QWebSocketServer仍在连接

QWebSocketServer仍在连接
EN

Stack Overflow用户
提问于 2015-12-29 12:39:35
回答 1查看 771关注 0票数 1

我正在编写一个简单的服务器,它通过QWebSocketServer将一些数据传递给javascript (基本等同于qt .)。

还有,请看这里:

代码语言:javascript
复制
void DebuggerServer::onNewConnection() {
    puts("C");
    QWebSocket *pSocket = m_pWebSocketServer->nextPendingConnection();

    connect(pSocket, &QWebSocket::textMessageReceived, this, &DebuggerServer::processMessage);
    connect(pSocket, &QWebSocket::disconnected, this, &DebuggerServer::socketDisconnected);

    printf("onNewConnection");

    m_clients << pSocket;
}

我试着在这里puts("C");,但是我什么也得不到。

在我的浏览器(最新版本的chrome)中,如果我向服务器发送请求,我将得到一些信息,比如socket is connecting

我尝试过这样的方法:关闭防火墙,改变端口,改变浏览器,改变编译模式。

我不确定这是否涉及到这个问题,我正在用msvc15和manully moc头编译这些代码。

此代码通过加载库注入到其他应用程序中。

服务器的完整源代码如下..。

Server.cpp

代码语言:javascript
复制
#include "Server.h"
#include "Inspector.h"

#include "Server.moc"

#include <QtCore/QCoreApplication>

const int port = 5642;
DebuggerServer *server;

void StartServer() {
    server = new DebuggerServer(port);
}

QT_USE_NAMESPACE

DebuggerServer::DebuggerServer(quint16 port, QObject *parent) :
    QObject(parent),
    m_pWebSocketServer(Q_NULLPTR),
    m_clients()
{
    m_pWebSocketServer = new QWebSocketServer(QStringLiteral("mvInspector"),
        QWebSocketServer::NonSecureMode,
        this);
    puts("A");
    if (m_pWebSocketServer->listen(QHostAddress::Any, port))
    {
        puts("B");
        connect(m_pWebSocketServer, &QWebSocketServer::newConnection,
            this, &DebuggerServer::onNewConnection);
    }
}


DebuggerServer::~DebuggerServer() {
    m_pWebSocketServer->close();
    qDeleteAll(m_clients.begin(), m_clients.end());
}

template<class T>
QString toStr(QList<T> y) {
    QString rst;
    for (T x : y)
        rst += "\n" + QString(x);
    return rst;
}

#define ASSERT_N(x) if (frame.length() != x) rst = "ERRON, wrong number of arguments."; else

void DebuggerServer::processMessage(QString message) {
    QWebSocket *pSender = qobject_cast<QWebSocket *>(sender());
    QStringList frame = message.split("\n");
    QString rst;

    rst += frame[0];
    if (frame[0] == "getRootWindows") {
        ASSERT_N(1)
        rst += toStr(getRootWindows());
    }
    if (frame[0] == "getChildren") {
        ASSERT_N(2)
        rst += toStr(getChildren(frame[1].toInt()));
    }
    if (frame[0] == "getPropertyName") {
        ASSERT_N(2)
        rst += toStr(getPropertyName(frame[1].toInt()));
    }
    if (frame[0] == "getProperty") {
        ASSERT_N(3)
        rst += getProperty(frame[1].toInt(), frame[2].toStdString().c_str()).toBase64();
    }
    if (frame[0] == "getClassname") {
        ASSERT_N(2)
        rst += getClassname(frame[1].toInt());
    }
    if (frame[0] == "getClassname") {
        ASSERT_N(2)
        rst += getObjectname(frame[1].toInt());
    }
    printf(rst.toStdString().c_str());
    pSender->sendTextMessage(rst);
}

void DebuggerServer::socketDisconnected()
{
    QWebSocket *pClient = qobject_cast<QWebSocket *>(sender());
    if (pClient) {
        m_clients.removeAll(pClient);
        pClient->deleteLater();
    }
    printf("socketDisconnected");
}

void DebuggerServer::onNewConnection() {
    puts("C");
    QWebSocket *pSocket = m_pWebSocketServer->nextPendingConnection();

    connect(pSocket, &QWebSocket::textMessageReceived, this, &DebuggerServer::processMessage);
    connect(pSocket, &QWebSocket::disconnected, this, &DebuggerServer::socketDisconnected);

    printf("onNewConnection");

    m_clients << pSocket;
}

Server.h

代码语言:javascript
复制
#pragma once
#include <QtCore/qobject.h>
#include <QtWebSockets/qwebsocketserver>
#include <QtWebSockets/QWebSocket>

void StartServer();

class DebuggerServer : public QObject {
    Q_OBJECT
public:
    explicit DebuggerServer(quint16 port, QObject *parent = Q_NULLPTR);
    virtual ~DebuggerServer();

private Q_SLOTS:
    void onNewConnection();
    void processMessage(QString message);
    void socketDisconnected();

private:
    QWebSocketServer *m_pWebSocketServer;
    QList<QWebSocket *> m_clients;
};

DLLMain

代码语言:javascript
复制
#include <Windows.h>

#include "../Server.h"

BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved){
    switch (ul_reason_for_call) {
    case DLL_PROCESS_ATTACH:
        StartServer();
        break;
    case DLL_PROCESS_DETACH:
        break;
    case DLL_THREAD_ATTACH:
        break;
    case DLL_THREAD_DETACH:
        break;
    }
    return TRUE;

}
EN

回答 1

Stack Overflow用户

发布于 2016-01-04 15:29:27

最后,它似乎是QT5.4.1的一个bug,至少在windows 10 (msvc)上是这样。

我可以通过websocket连接两个Qt应用程序,但不能让应用程序与普通浏览器连接。

因此,我使用另一个websocket库并修复原来的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34511274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档