C# Socket客户端采用双线程断网重连断线重连)
C# Socket客戶端采用雙線程斷網重連斷線重連
- 2021年07月15日 13:38:18更新
- C# Socket服務端 雙線程斷網重連斷線重連
- C# Socket客戶端采用雙線程斷網重連斷線重連
- 四、原代碼地址
一、C#里面,我們可以使用 Thread.Start方法來啟動一個線程,當我們想停止執行的線程時可以使用Thread.Abort方法來強制停止正在執行的線程,但是剛開始筆者使用單線程起動與停止線程卻沒有做到理想的結果卻給筆者一頭的霧水。剛開始,用Socket類的Connected屬性來實現,卻發現行不通,connected只表示 是在上次 還是 操作時連接到遠程主機。如果在這之后[連接的另一方]斷開了,它還一直返回true,筆者使用Abort來終止線程得到的結果卻是線程狀態《ThreadState》被掛起為《Suspend》想進入到《Aborted》狀態卻永遠做不到。在Socket客戶端連接服務器有時因為斷網或長時間收不到服務器消息就要重新連接服務端,筆者剛開始采用的是單線程連接結果用了所有的辦法都達不到理想狀態,于是想到了使用雙線程連接結果達到了筆者所想要的結果。服務端采用心跳包發送數據。客戶端用來檢測發過來的數據。如果6秒鐘檢測不到數據就認為連接斷開進行重新連接。效果如下圖(一)所示:
網絡斷開重連如圖(二)所示
二、雙線程部分代碼
#region 線程一與線程二起動/********************************************************************************************** * Author: <杏雨> * Create date: <2021年7月2日> * Description:< 線程一,線程二起動方法 > * 一、線程關閉使用Abort方法能在目標線程中拋出一個ThreadAbortException異常從而導致目標線程的終止。不過Abort方法被調用后,目標線程可能并不是馬上就終止了。因為只要目標線程正在調用非托管的代碼而且還沒有返回的話,該線程就不會立即終止。而如果目標線程在調用非托管的代碼而且陷入了一個死循環的話,該目標線程就根本不會終止。 * * 二、只使用一個線程使用Abort方法關閉線程是關閉不了的,使用的結果是線程狀態<ThreadState>將被掛起<Suspend()>永遠進入不了 <Aborted>狀態這一點作者已經驗證。 * * 三、本例使用雙線程進行切換是結束線程的一個好方法。由于接收方法<ReceiveMsg()>接收服務端發送的消息是一個while循環 如果設置為TRUE將是一個死循環,一個死循環線程是無法退出的,所以在while循環中設置了開關<jumpLoopFlg>如果為FALSE while死循環才能退出,并在循環中設置一個檢測jumpLoopFlg真假判斷如果為假則退出循環。時鐘是判斷是否退出循環的唯一 方法 **********************************************************************************************/private void Thread_1_Start(){string strEroor = string.Format("服務器連接已斷開,正在起動線程(1)重新鏈接...\r\n");AppendToText(strEroor);jumpLoopFlg = false;//先關循環client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);thCondition = 1;jumpLoopFlg = true;//然后在起動ConnectSocket(thCondition, PublicConts.ip, PublicConts.post);ThreadTime();string ipAdd = client.LocalEndPoint.ToString();string remote = client.RemoteEndPoint.ToString();string str = string.Format("線程(1)起動SocKet成功:本地地址:{0}服務器地址{1}", ipAdd, remote);AppendToText(str);Thread.Sleep(1000);}private void Thread_2_Start(){string strEroor = string.Format("服務器連接已斷開,正在起動線程(2)重新鏈接...\r\n");AppendToText(strEroor);jumpLoopFlg = false;client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);thCondition = 2;jumpLoopFlg = true;ConnectSocket(thCondition, PublicConts.ip, PublicConts.post);ThreadTime();string ipAdd = client.LocalEndPoint.ToString();string remote = client.RemoteEndPoint.ToString();string str = string.Format("線程(2)起動SocKet成功:本地地址:{0}服務器地址{1}", ipAdd, remote);AppendToText(str);Thread.Sleep(1000);}#endregion2021年07月15日 13:38:18更新
C# Socket服務端 雙線程斷網重連斷線重連
1、修改了斷網判斷不準確的BUG
2、修改了運行2-4小時就假死機的現象,本次運行24小時不停機沒有發現問題
3、增加了客戶端心跳包的檢測
C# Socket客戶端采用雙線程斷網重連斷線重連
1、修改了斷網判斷不準確的BUG
2、增加了服務器端故障檢測與斷網重連
3、增加了對服務器端心跳包的檢測
4、服務器端故障檢測采用雙線程中的一個線程進行檢測。以前采用新開一個Socket進行重新連接,連接成功后在刪除這個Socket這樣會造成服務器端的繁忙刪除
5、服務器端與客戶端進行了24小時不停機測試現在沒有發現問題,以前半小時后或2-4小時就會斷線重連主要原因是斷網的誤判造成。這次增加了對心跳包檢測
三、下圖是客戶端先開,然后在開服務器端的效果圖,一般情況下是先開服務器端在開客戶端,否則就會出現異常,由于作者對客戶端增加了服務器端的錯誤檢測所以在后開服務器也沒有什么問題。由于是雙線程當一個線程連接出現故障系統會自動切換到另一個線程繼續工作。
四、原代碼地址
1、 服務端:https://download.csdn.net/download/weixin_43727933/20059245
2、客戶端:https://download.csdn.net/download/weixin_43727933/20058707
總結
以上是生活随笔為你收集整理的C# Socket客户端采用双线程断网重连断线重连)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 记一次微信点赞小网站的事故
- 下一篇: C# OCR AspriseOcr测试使