在qt的學習網路的學習中,最大的問題是伺服器與客戶端收發資料的問題,當一方連續傳送幾次資料給另一方時,容易出現好幾種錯誤:
1、收到的資料不全,只有第乙個
2、收不到
3、收到的資料不對
readyread在訊號到達時,開始接收,我即使呼叫幾次write,也不能解決這個問題。
我嘗試了幾個方法(傳送的是結構體)
1、加延時,在write的時候,結果失敗;
2、加入某博主說的,write後加waitfotbyteswritten,結果,在我傳送十次資料的時候,得到的資料是跳動的,不連續的。
3、在每次傳送前,加入乙個頭,指示有多少資料,讀取的時候,readall,會把所有的資料讀到array,讀取的資料的型別為qbyte
array,是二進位制,這時候需要把array分解出來,char* buff = array.data(); buff指向array的第乙個位元組,int num;然後memcpy(&num,buff,sizeof(int));把頭分解出來,buff+=sizeof(int),buff此時指向第乙個傳送的資料,這樣就可以解決了。
隱患:目前只針對小資料,大資料還沒有測試,因為不確定readyread一次能讀取多大的資料。
void enqueuecommand(qbytearray str)
bool sendmessage(short cmd,const qstring &message)
qbytearray msg = message.toutf8();
msgheader header;
memcpy(&header, &msgheader, sizeof(msgheader));
header.cmd = cmd;
header.size = msg.size();
qbytearray data((const char*)&header, sizeof(msgheader));
data += msg;
enqueuecommand(data);
return true;
}void writedatatostu(void)//執行緒訊息傳送
tcpsocket->flush();
}m_queuemutex.unlock();
傳送的結構體資料加了頭之後android客戶端仍然存在第二條命令接收不到的情況-----自己寫的demo資料都能接收到
---在客戶端電腦上使用wireshark抓包工具檢視是否有接收到對應的結構體資料
QTcpSocket 傳送和接收資料的幾種方法
1 qtcpsocket 繼承於qabstractsocket繼承於qiodevice 2 qtcpsocket 提供的幾種接收和傳送資料方法 3 例子1 write const qbytearray qint64 cpp 用於暫存要傳送的資料 qbytearray block 使用資料流寫入資料 ...
連續平方數
size small color green b 連續平方數 為了表示方便,我們把5的平方記為 5 2 這樣,連續自然數的平方和就記為 1 2 2 2 3 2 4 2 請看下面的公式 1 2 2 2 3 2 4 2 x 2 y 2 是不是存在整數x,y,使得公式成立呢?顯然x y 1 勉強成立,數學...
連續數 與 離散數
在eclipse裡試一下,以下 的輸出是多少?double a 19 3.3 system.out.println a a 為什麼結果不是 62.7 顯示的結果為 62.699999999999996 而不是 62.7 為什麼?1 62.7 和 62.699999999999996 實際意義上是一樣...