QTcpSocket連續傳送資料的問題

2021-09-29 04:36:29 字數 1233 閱讀 8625

在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 實際意義上是一樣...