| 藍星星回復于30日14點(diǎn)55分 暈倒,都說(shuō)了啊,解決辦法就是在每次收到一個(gè)包以后,發(fā)送一個(gè)0字節空包,發(fā)的出去就說(shuō)明沒(méi)斷,發(fā)不出去就會(huì )出現“遠程主機強行關(guān)閉了一個(gè)連接”的異常,撲獲這個(gè)異常就可以了,斷開(kāi),等待重連,接下來(lái)什么的就是你的事了 另外我問(wèn)下你,在服務(wù)端斷開(kāi)以后,客戶(hù)端的CPU是不是一直處于100%的狀態(tài)?如果是的話(huà),那么這個(gè)辦法絕對可以解決的! |
| 冷光乾回復于30日15點(diǎn)34分 我的問(wèn)的是怎么連呀,不是問(wèn)怎么知道服務(wù)器斷了!能寫(xiě)一個(gè)異步連接的方法嗎? |
| 好子娘回復于30日16點(diǎn)13分 至于斷開(kāi)以后怎么重連,暈死,你第一次怎么連后面就怎么連啊,比如說(shuō)斷開(kāi)以后,就進(jìn)入一個(gè)循環(huán),來(lái)循環(huán)進(jìn)行連接,如果連接成功,那么跳出這個(gè)循環(huán),開(kāi)始進(jìn)入另一個(gè)循環(huán)來(lái)接受數據 |
| xiaoxue9757回復于30日16點(diǎn)56分 SOCKET一直就有這個(gè)問(wèn)題,服務(wù)端斷開(kāi)以后,相信你的客戶(hù)端的CPU一直處于100%,因為再不停的無(wú)限循環(huán)的接受一個(gè)0字節包 解決辦法就是發(fā)送心跳包,或者每收到一個(gè)包,就發(fā)送一個(gè)0字節包,斷開(kāi)了的話(huà)就會(huì )異常 |
| 家有大寶回復于30日17點(diǎn)37分 關(guān)注。呵呵 |
| dd970322回復于30日18點(diǎn)14分 可能是你的 客戶(hù)端 沒(méi)有 收到斷開(kāi)連接的 信息。 這個(gè)需要在通信 協(xié)議里面 加個(gè) 心跳 報文, 每隔多少時(shí)間 收不到 就 斷開(kāi) 重連 |
| 瀟湘紫藤回復于30日18點(diǎn)57分 我剛才找到一種方法,但是不是知道是不是最好的,就是在我的方法里面把Socket重新生成一個(gè) _Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); |
| tianyi回復于30日19點(diǎn)42分 其實(shí)主要的問(wèn)題是服務(wù)端如果是強制斷開(kāi),也就是物理斷開(kāi)或者直接結束了進(jìn)程這種斷開(kāi),客戶(hù)端是接收不到斷開(kāi)請求的,也就是說(shuō)這個(gè)時(shí)候的客戶(hù)端并不認為斷開(kāi)了,而且客戶(hù)端還在不停的接受一個(gè)0字節的數據包,無(wú)限循環(huán),所以還會(huì )導致客戶(hù)端的CPU一直處于100%的狀態(tài) 這個(gè)問(wèn)題我之前寫(xiě)一個(gè)C/S通訊程序的時(shí)候碰到過(guò),解決辦法找了一天都是些非常麻煩的方案,于是我自己想了個(gè)辦法,就是在每次接受數據的時(shí)候,發(fā)送一個(gè)0字節包,這樣的話(huà)服務(wù)端如果斷開(kāi),那么客戶(hù)端就會(huì )開(kāi)始無(wú)限循環(huán)接受一個(gè)0字節包,那么再接受以后,按我說(shuō)的方案,還會(huì )在返回一個(gè)0字節包,但是肯定無(wú)法發(fā)送,所以會(huì )異常,撲獲就OK了??! 客戶(hù)端代碼: '接受數據,收到后返回一個(gè)垃圾包 XXX.Send(Encoding.Unicode.GetBytes("0")) '垃圾包 '如果服務(wù)端已斷開(kāi),那么肯定發(fā)不出去,結果異常,撲獲就行了,VB中是TRY,C#就不知道了 |
| sr2008回復于30日20點(diǎn)27分 先開(kāi)客戶(hù)端 這時(shí)候服務(wù)器沒(méi)開(kāi) 連接語(yǔ)句已經(jīng)執行 以后當然就連不上了 應該加個(gè)連接檢測 如果發(fā)現沒(méi)連上或斷開(kāi)后多少時(shí)間自動(dòng)重連接 |
| 急也沒(méi)用回復于30日21點(diǎn)08分 你第一次怎么連就是怎么連。。。 |
| lw334554回復于30日21點(diǎn)54分 網(wǎng)羅編程我關(guān)注 |
| 神行鼠回復于30日22點(diǎn)37分 我問(wèn)的就是怎么重連呀? 我專(zhuān)門(mén)寫(xiě)了一個(gè)重連函數,第一次(服務(wù)器先啟動(dòng)的情況),用這個(gè)函數是可以連的,然后我把服務(wù)器關(guān)閉再開(kāi)啟,就連不上去了,說(shuō)遠程主機強行關(guān)閉了一個(gè)連接。 還有一種情況是,我先開(kāi)客戶(hù)端,這個(gè)時(shí)候客戶(hù)端處于一直連接狀態(tài),等我開(kāi)了服務(wù)器就立馬連上了,在重啟服務(wù)器又連不上了。 我的重連函數是: /// <summary> /// 異步連接 /// </summary> private void ReConnectAsync() { SocketAsyncEventArgs ConnectAsyncEvent = new SocketAsyncEventArgs(); ConnectAsyncEvent.Completed += new EventHandler <SocketAsyncEventArgs>(ConnectAsync_Completed); ConnectAsyncEvent.UserToken = _Socket; ConnectAsyncEvent.AcceptSocket = _Socket; ConnectAsyncEvent.RemoteEndPoint = GetEndPont(); //開(kāi)始連接事件 CallEvent(OnConnecting, this, new EventArgs()); //異步連接 try { //重連次數增加 _RetryCount++; if (!_Socket.ConnectAsync(ConnectAsyncEvent)) { if (!Connected) {//沒(méi)連接繼續連 AutoConnectMeoth(); } } //在異步連接完的回調方法(ConnectAsync_Completed)里面開(kāi)始異步接收 } catch { if (_DebugMode) { throw; } } } |
| 愛(ài)咋咋的回復于30日23點(diǎn)14分 1.tcp/ip 服務(wù)器中斷客戶(hù)端肯定是會(huì )得到通知,但是這個(gè)時(shí)候你可以通過(guò)timer來(lái)循環(huán)橋接。如果是FLASH SOCKET那可以通過(guò)JS來(lái)進(jìn)行循環(huán)橋接。 2.UDP/IP 由于是無(wú)鏈接的,所以需要通過(guò)心跳包來(lái)進(jìn)行報文監測??蛻?hù)端接受心跳包報文超過(guò)設定的心跳時(shí)間間隔,那就嘗試循環(huán)嘗試是否存在服務(wù)器,如果心跳包報文仍能按照間隔發(fā)包,那就證明已經(jīng)在鏈接狀態(tài)中。。。 |
| 滴滴嘟嘟回復于31日02點(diǎn)47分 你所陳述的并不是你代碼的問(wèn)題,而是解決這種異常狀況的思路問(wèn)題, |
聯(lián)系客服