使用 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/