QT 中Socket客戶端與伺服器異常斷開後重連

2021-08-28 06:21:52 字數 3312 閱讀 5966

在現在的專案開發中,經常要使用tcp/ip協議來進行通訊,但有時候與伺服器端的鏈結由於網路問題導致連線異常或斷開,這就需要我們的軟體能自動重連,在linux中,我們的思維一般是通過心跳包來監控連線是否斷開,有時候還單獨開乙個執行緒,但是在qt中,就變得簡單多了,當連線異常斷開時,會觸發相應的訊號,我們只要在這個訊號對應的槽函式中做重連處理就可以了,不需要另開執行緒也不需要心跳包。由於網上查的qt重連伺服器端,大多都是通過建立的執行緒去實現,我覺得比較麻煩,這裡就記錄下我自己的思路:使用定時器qtimer或定時器事件qtimerevent,來實現重連,當當前的連線斷開時,qt便會傳送 disconnected()訊號,我們在這個訊號對應的槽函式中開啟定時器,重連的操作就放在定時器對應的槽函式中執行(或重寫的定時器事件中執行),當重連成功後,qt會傳送connected()訊號,此時我們在其對應的槽函式中關閉定時器即可。

下邊直接來貼**,我們是建了乙個簡單的clientt類,來做乙個socket客戶端,首先是標頭檔案client.h檔案

#ifndef client_h#define client_h#include#include#include

#include

#include

#include

#include

#include

#include

class client : public qwidget

;

#endif // client_h

下邊是client.cpp檔案

#include "client.h"#include#include#include#include

#include

client::client(qwidget *parent) : qwidget(parent), m_isconnected(false)

void client::init()

void client::newtcpconnect()

}

//接收資料

void client::clientreaddata()

//連線成功是時呼叫

void client::clientconnected()

//連線斷開時呼叫

void client::clientdisconnected()

//獲取socket錯誤資訊

void client::clienterror(qabstractsocket::socketerror socketerror)

//連線狀態發生改變時獲取其狀態

void client::clientstatechange(qabstractsocket::socketstate socketstate)

else if (socketstate == qabstractsocket::hostlookupstate)

else if (socketstate == qabstractsocket::connectedstate)

else if (socketstate == qabstractsocket::connectingstate)

else if (socketstate == qabstractsocket::closingstate)

#endif

}

void client::onconnectbuttonclicked()

else if(m_connectbutton.text() == "connect")

}

void client::timerevent(qtimerevent * event)

}

}

//使用定時器來重連伺服器

void client::slottimeout()

}

client::~client()

主程式中直接使用這個類:

#include "client.h"int main(int argc, char *argv)編譯執行:

剛開始與伺服器端正常連線並接收資料hello sokect,然後我關掉伺服器,於是客戶端便進行重連...,後邊重開伺服器,客戶端便重連成功。

上邊是把定時器事件給遮蔽了,使用定時器來實現,也可以把定時器遮蔽,使用定時器事件進行重連,具體視專案情況而定。

客戶端與服務端的Socket通訊

客戶端 public class client catch exception e public void start else catch exception e public static void main string args catch exception e 該執行緒專門用來迴圈讀取服...

socket 實現客戶端與服務端通訊

python內的socket已經預設實現了tcp和udp兩種傳輸協議。本文通過乙個簡單的例子記錄一下socket的簡單使用方法。實現 客戶端和服務端通過tcp協議通訊,客戶端向服務端傳送訊息,服務端接收訊息後新增 too 字串後返回給客戶端,客戶端可以主動斷開連線。服務端 import socket...

服務端 客戶端Socket通訊

服務端 using system using system.collections.generic using system.net using system.net.sockets using system.text using system.text.regularexpressions usi...