QTcpSocket類的方法connectToHost會泄露內存,即使把調用這個方法的QTcpSocket實例delete掉,內存也不會釋放!反復connectToHost會導致段錯誤,十分危險。必須控制connectToHost的使用次數!
-
連接服務器
m_tcpSocket->connectToHost(“127.0.0.1”, 9877);
connected = m_tcpSocket->waitForConnected();
只有使用waitForConnected()后,QTcpSocket才真正嘗試連接服務器,並返回是否連接的結果。 -
寫數據
m_tcpSocket->write(str.toStdString().c_str(), strlen(str.toStdString().c_str()));
m_tcpSocket->waitForBytesWritten();
當使用waitForBytesWritten()后,QTcpSocket才真正發送數據。
m_tcpSocket->write(str1.toStdString().c_str(), strlen(str1.toStdString().c_str()));
m_tcpSocket->write(str2.toStdString().c_str(), strlen(str2.toStdString().c_str()));
的結果是發送了str1str2 -
斷開與服務器的連接
m_tcpSocket->disconnectFromHost()
m_tcpSocket->waitForDisconnected() -
善於使用QTcpSocket的SIGNAL:connected(),disconnected(),error(QAbstractSocket::SocketError)
配合自定義私有開關變量bool connected,QTimer可以實現自動重連接等邏輯。(注意:如果一個線程有多個連接的話,由於QTimer是中斷當前線程的事件消息,故會影響其他連接,且重連接費時,故不太適用)
QTcpSocket調試經驗分享
這久在寫一個基於TCP的通信程序,Server端用WinCE實現,而Client端用Qt實現,之前已寫了一個VC的Client端,能正確向Server發送數據。
將Client端改用Qt實現后connectToHost()后,server端已能正確accept(),但就是write()后server的read函數無法響應。調試了半天沒有成功,火大呀!今天試着輸出socket的狀態后得到如下:
bool TcpClient::newConnect(const QString &iAddr, quint16 iPort)
{
mSocket = newQTcpSocket(this);
mSocket->connectToHost(iAddr,iPort);
qDebug(“State:%d\n”,mSocket->state()); // State: 2; 2代表ConnectingState,正確的應該為3(ConnectedState)
connect(mSocket,SIGNAL(readyRead()),this,SLOT(read()));
connect(mSocket,SIGNAL(disconnected()),this,SLOT(disConnect()));return(true);
}
qint64 TcpClient::write(const QByteArray &iData)
{
qint64len = mSocket->write(iData);
qDebug(“State:%d\n”,mSocket->state()); // State: 2; 2代表ConnectingState,正確的應該為3(ConnectedState)
msleep(200);
return(len);
}
通過輸出狀態,已經找到問題的所在,哎!都是業務不熟害的呀!
socket的連接是異步的,所以必須等連接建立完成才能使用,所以分別加入waitForConnected()和waitForBytesWritten()后調試通過。
bool TcpClient::newConnect(const QString &iAddr, quint16 iPort)
{
mSocket = newQTcpSocket(this);
mSocket->connectToHost(iAddr, iPort);
qDebug(“State:%d\n”,mSocket->state()); // State: 2; 2代表ConnectingState,正確的應該為3(ConnectedState)
constintTimeout=5*1000;
if(!mSocket->waitForConnected(Timeout))
{
return(false);
}
qDebug("State:%d\n",mSocket>state()); // State: 3(ConnectedState)正確
connect(mSocket,SIGNAL(readyRead()),this,SLOT(read()));
connect(mSocket,SIGNAL(disconnected()),this,SLOT(disConnect()));return(true);
}
qint64 TcpClient::write(const QByteArray &iData)
{
qint64len = mSocket->write(iData);
mSocket->waitForBytesWritten(300);
qDebug(“State:%d\n”,mSocket->state()); // State: 3(ConnectedState)正確
msleep(200);
return(len);
}
轉自:http://blog.csdn.net/u011125673/article/details/50474491