微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

QTcpSocket问题

如何解决QTcpSocket问题

| 使用Qt编写聊天。有问题。我的客户端的QTcpsocket保持连接状态,但是服务器发出newConnection()信号。不需要网络会话。这是为什么?这是一些代码
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()),SLOT(requestForID()));
    connect(tcpsocket,SIGNAL(readyRead()),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()),SLOT(processConnection()));
}
void ChatServer::processConnection() {
    qDebug() << \"Incoming connection\";
    QTcpsocket *clientSocket = tcpserver->nextPendingConnection();
    /*connect(clientSocket,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套接字超时计时器认为永远不会建立连接。 解决方案是将其称为“延迟”,例如
QMetaObject::invokeMethod(this,\"OnDelayedConnect\",Qt::QueuedConnection);
或在
connectToHost
之后呼叫
waitForConnected()
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。