QTcpSocket问题

标签 qt qtcpsocket

使用 Qt 编写聊天记录。有问题。我的客户端的 QTcpSocket 保持连接状态,但服务器发出 newConnection() 信号。不需要网络 session 。这是为什么?这是一些代码:

ChatClient::ChatClient(QObject *parent)
    : QObject(parent) {
    tcpSocket = new QTcpSocket(this);
    QNetworkConfigurationManager manager;
    if (QNetworkConfigurationManager::NetworkSessionRequired
        & manager.capabilities()) {
        qDebug() << "Network session required";
    }
    connect(tcpSocket, SIGNAL(error(QAbstractSocket::SocketError)),
            this, SLOT(error(QAbstractSocket::SocketError)));
    connect(tcpSocket, SIGNAL(connected()),
            this, SLOT(requestForID()));
    connect(tcpSocket, SIGNAL(readyRead()),
            this, SLOT(receiveMessage()));
    tcpSocket->connectToHost("192.168.0.100", PORT);
}

void ChatClient::requestForID() {
    qDebug() << "Connected, requesting for ID";
    QByteArray segment;
    QDataStream out(&segment, QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_4_7);
    out << (quint16)0 << ID;
    out.device()->seek(0);
    out << (quint16)(segment.size() - sizeof(quint16));
    tcpSocket->write(segment);
}

requestForID() 从未被执行

ChatServer::ChatServer(QObject *parent)
    : QObject(parent) {
    tcpServer = new QTcpServer(this);
    if (!tcpServer->listen(QHostAddress::Any, PORT)) {
        qDebug() << "Unable to start the server"
                 << tcpServer->errorString();
    }
    qDebug() << "Server port" << tcpServer->serverPort();
    connect(tcpServer, SIGNAL(newConnection()),
            this, SLOT(processConnection()));
}
void ChatServer::processConnection() {
    qDebug() << "Incoming connection";
    QTcpSocket *clientSocket = tcpServer->nextPendingConnection();
    /*connect(clientSocket, SIGNAL(readyRead()),
            this, SLOT(readData()));
    readData(clientSocket);
    connect(clientSocket, SIGNAL(disconnected()),
            clientSocket, SLOT(deleteLater()));*/
    QByteArray segment;
    QDataStream out(&segment, QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_4_7);
    out << (quint16)0 << (quint16)Message
        << "Successfully connected";
    out.device()->seek(0);
    out << (quint16)(segment.size() - sizeof(quint16));
    clientSocket->write(segment);
    clientSocket->disconnectFromHost();
}

服务器显示传入连接,客户端不会发出保持连接状态的连接,也不会接收服务器消息... 有什么想法吗?

最佳答案

我也遇到了同样的问题,我找到了原因和解决方案。

connectToHost 不能直接在主窗口的构造函数中调用。为什么?

原因是,此时主消息循环尚未运行。在内部,QAbstractSocketPrivate::fetchConnectionParameters() 从未被调用,并且 Qt Socket Timeout Timer 认为连接从未建立。

解决方案是像中那样将其称为“延迟”

QMetaObject::invokeMethod(this, "OnDelayedConnect", Qt::QueuedConnection);

或者在connectToHost之后调用waitForConnected()

关于QTcpSocket问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6143487/

相关文章:

c++ - 如何知道QUdpSocket中的发送端口号?

python - pyqt4 + 单选按钮

c++ - QTcpSocket 无法绑定(bind)到正确的 IP

c++ - QThread 和 QTcpSocket

c++ - 使用 QDataStream 从 QTcpSocket 读取

c++ - 如何以几秒的间隔多次使用 QTcpSocket 实例?

c++ - 如何使用样式表为 Qt Widget 而不是其子项设置样式?

macos - Qt5 为 Mac 设置应用程序图标

xml - PyCharm 4 不会在双击 .ui 文件时打开 Qt Designer。 (Linux)

c++ - Qt 客户端-服务器应用程序, “send image” 有问题