目標,qt程序作為客戶端,windows下winsock作為服務器端,實現兩端通信。
開始時寫了一個小函數測試:
[cpp] view plain
copy
QTcpSocket tmpSock;
tcpSock.connectToHost("59.64.159.87",7716);
tcpSock.write(buf,strlen(buf)+1);
msleep(3000);
tcpSock.disconnect();
測試結果發現客戶端只能連接到服務器端,而服務器端收不到客戶端的消息。
初步揣測也許是Qt的socket機制使得socket緩沖隊列沒有即時發送。
換另一方法:
[cpp:showcolumns] view plain
copy
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
QTcpSocket tmpSock;
char* buf ="hello";
tcpSock.connectToHost("59.64.159.87",7716);
tcpSock.write(buf,strlen(buf)+1);
msleep(3000);
tcpSock.disconnect();
運行后,發現結果仍然不對。開始思考Qtsocket通信機制。想到這有可能是因為Qtcpsocket是非阻塞的方式引起的。
在網上查找,發現了一些資料。
QTcpSocket因為繼承自QAbstractSocket,所以如果不采取一些措施的話,他就處於非阻塞方式,也就是事件編程,這有個好處就是可以在一個線程中實現多路tcp鏈接,節省資源,但是這種方式的編程難度比較大。
對於初涉這方面的朋友來說還不太適合,所有在滿足要求的情況下還是阻塞方式的socket編程比較容易理解,QAbstractSocket里面提供了幾個函數用於阻塞方式編程,利用好它就可以簡單的編寫出網絡應用了:
waitForConnected() 等待鏈接的建立
waitForReadyRead() 等待新數據的到來
waitForBytesWritten() 等待數據寫入socket
waitForDisconnected() 等待鏈接斷開
當接收數據時,我們有個模式可以遵循:
[c-sharp] view plain
copy
while (socket.bytesAvailable() < (int)nSize) {
if (!socket.waitForReadyRead(Timeout)) {
emit error(socket.error(),
socket.errorString());
return;
}
}
這段話的主要意思就是等待nSize個數的到來,這是個一定要遵守的接收數據模板,可以把它寫成一個內聯函數,如果段話滿足條件,就可以容read讀數了。
寫數的話調用write,之后調用waitForBytesWritten來確定數據是否寫完。
然后修改原來的代碼。
[c-sharp] view plain
copy
QTcpSocket tmpSock;
char* buf ="hello";
tcpSock.connectToHost("59.64.159.87",7716);
tcpSock.write(buf,strlen(buf)+1);
if(tcpSock.waitforreadyread(3000))
emit SockCondition("successful");
else
emit SockCondition("failed");
tcpSock.disconnect();
運行測試成功
http://blog.csdn.net/itjobtxq/article/details/8203809