优化代码 if(m_tcpSocket->state()==QAbstractSocket::ConnectedState){ //如果使用disconnectFromHost()不会重置套接字,isValid还是会为true slot_tcpClose(); }else if(m_tcpSocket->state()==QAbstractSocket::UnconnectedState){ //连接服务器 m_tcpSocket->bind(QHostAddress(localip)); m_tcpSocket->connectToHost(remoteip, remoteport);//连接服务器 } //连接成功时 if(m_tcpSocket->waitForConnected(3000))//只有使用waitForConnected()后,QTcpSocket才真正尝试连接服务器,并返回是否连接的结果。 { qDebug()<<"连接成功"; emit signal_connectStatus("连接成功"); } else { qDebug()<<"连接失败"; emit signal_connectStatus("连接失败"); slot_tcpClose(); }
时间: 2024-03-19 21:44:38 浏览: 92
可以考虑使用信号和槽来优化代码。将连接状态的检测和连接操作分开处理,避免在连接状态不对时执行连接操作,同时也可以避免使用 `waitForConnected()` 方法阻塞主线程。具体的实现方法如下:
```c++
void connectToServer(const QString& localIp, const QString& remoteIp, int remotePort) {
if (m_tcpSocket->state() == QAbstractSocket::ConnectedState) {
slot_tcpClose();
}
else if (m_tcpSocket->state() == QAbstractSocket::UnconnectedState) {
m_tcpSocket->bind(QHostAddress(localIp));
m_tcpSocket->connectToHost(remoteIp, remotePort);
}
}
void onTcpSocketConnected() {
qDebug() << "连接成功";
emit signal_connectStatus("连接成功");
}
void onTcpSocketError(QAbstractSocket::SocketError error) {
qDebug() << "连接失败:" << error;
emit signal_connectStatus("连接失败");
slot_tcpClose();
}
```
使用 `connectToServer()` 函数来连接服务器,将本地 IP 地址和远程 IP 地址及端口号作为参数传入。在该函数中,首先检查当前的连接状态,如果已经处于连接状态,则断开连接。然后判断当前的连接状态,如果未连接,则绑定本地 IP 地址并连接远程服务器。
在连接成功时,触发 `connected()` 信号,调用 `onTcpSocketConnected()` 槽函数进行处理,该函数中打印连接成功的信息并发出连接状态的信号。
在连接失败时,触发 `error(QAbstractSocket::SocketError)` 信号,调用 `onTcpSocketError(QAbstractSocket::SocketError)` 槽函数进行处理,该函数中打印连接失败的信息并发出连接状态的信号,然后关闭连接。
通过使用信号和槽,可以将连接状态的检测和连接操作分开处理,避免在连接状态不对时执行连接操作,同时也可以避免使用 `waitForConnected()` 方法阻塞主线程。
阅读全文