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