amp@java

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            99 隨筆 :: 0 文章 :: 228 評(píng)論 :: 0 Trackbacks

          打開(kāi)了連接服務(wù)器的一個(gè)Socket后,隔了一段時(shí)間沒(méi)用,Socket就會(huì)自動(dòng)關(guān)閉(為什么?),這時(shí)候如果獲取該Socket的OutputStream,并往里面寫東西,在flush的時(shí)候就會(huì)出現(xiàn):
          java.net.SocketException: Software caused connection abort: socket write error
          的異常。因此,如果隔了一段時(shí)間沒(méi)有使用某個(gè)Socket,需要重新使用它的時(shí)候,就要先判斷它究竟是否還在連接當(dāng)中,一共嘗試了Socket的三個(gè)方法:
          1、isClosed()
          2、isOutputShutdown()
          3、isConnected()
          發(fā)現(xiàn)前兩個(gè)都沒(méi)用,即使已經(jīng)斷開(kāi)了,返回的還是false,只有第三個(gè)可以解決問(wèn)題。
          具體原因未知。

          2007-4-19更新:
          第三個(gè)也解決不了問(wèn)題,還會(huì)出現(xiàn)同樣的異常,目前的解決方法是catch SocketException,不管socket的狀態(tài)如何,都把它關(guān)閉了重新再連,但是SocketException的種類有很多,不一定是因?yàn)镾ocket已關(guān)閉,所以這種方法有點(diǎn)粗魯,但找不到更好的方法。

          posted on 2007-04-12 12:21 amp@java 閱讀(13137) 評(píng)論(8)  編輯  收藏 所屬分類: Java common

          評(píng)論

          # re: 如何判斷Socket已斷開(kāi) 2007-04-28 12:18 ddbird
          3、isConnected()

          一樣沒(méi)用 只要連上過(guò),就一直給true  回復(fù)  更多評(píng)論
            

          # re: 如何判斷Socket已斷開(kāi) 2007-05-07 01:15 amp@java
          的確三個(gè)方法都沒(méi)用,不知道如何解決這個(gè)問(wèn)題。如果服務(wù)器和客戶端都是自己做的,可以采用心跳測(cè)試的方法,但有時(shí)候服務(wù)器不是自己做的,只做客戶端,就不知道怎么判斷究竟連接是否還有效了。  回復(fù)  更多評(píng)論
            

          # re: 如何判斷Socket已斷開(kāi) 2008-01-02 14:20 cosmicbao
          isConnect()方法是判斷最近一次是否連接上的,
          所以對(duì)本次連接不起作用  回復(fù)  更多評(píng)論
            

          # re: 如何判斷Socket已斷開(kāi) 2008-09-22 21:01 liuguoling
          最近在開(kāi)發(fā)中遇到一個(gè)問(wèn)題,就是如何判斷遠(yuǎn)端服務(wù)器是否已經(jīng)斷開(kāi)連接,如果斷開(kāi)那么需要重新連接。

          首先想到socket類的方法isClosed()、isConnected()、isInputStreamShutdown()、isOutputStreamShutdown()等,但經(jīng)過(guò)試驗(yàn)并查看相關(guān)文檔,這些方法都是本地端的狀態(tài),無(wú)法判斷遠(yuǎn)端是否已經(jīng)斷開(kāi)連接。

          然后想到是否可以通過(guò)OutputStream發(fā)送一段測(cè)試數(shù)據(jù),如果發(fā)送失敗就表示遠(yuǎn)端已經(jīng)斷開(kāi)連接,類似ping,但是這樣會(huì)影響到正常的輸出數(shù)據(jù),遠(yuǎn)端無(wú)法把正常數(shù)據(jù)和測(cè)試數(shù)據(jù)分開(kāi)。

          最后又回到socket類,發(fā)現(xiàn)有一個(gè)方法sendUrgentData,查看文檔后得知它會(huì)往輸出流發(fā)送一個(gè)字節(jié)的數(shù)據(jù),只要對(duì)方Socket的SO_OOBINLINE屬性沒(méi)有打開(kāi),就會(huì)自動(dòng)舍棄這個(gè)字節(jié),而SO_OOBINLINE屬性默認(rèn)情況下就是關(guān)閉的,太好了,正是我需要的!

          于是,下面一段代碼就可以判斷遠(yuǎn)端是否斷開(kāi)了連接:

          try{
          socket.sendUrgentData(0xFF);
          }catch(Exception ex){
          reconnect();
          }  回復(fù)  更多評(píng)論
            

          # re: 如何判斷Socket已斷開(kāi) 2009-09-17 10:15 我們
          首先調(diào)用socket的setKeepAlive(true)確保主動(dòng)連接,這樣當(dāng)斷開(kāi)的時(shí)候isConnected()就是false  回復(fù)  更多評(píng)論
            

          # re: 如何判斷Socket已斷開(kāi) 2010-05-07 16:16 寶貝兔
          怎么寫長(zhǎng)連接的socket客戶端呢?  回復(fù)  更多評(píng)論
            

          # re: 如何判斷Socket已斷開(kāi) 2013-01-29 17:23 wee
          isConnected()&&!isClosed()  回復(fù)  更多評(píng)論
            

          # re: 如何判斷Socket已斷開(kāi) 2015-05-14 14:55 songxin
          @liuguoling
          這種方法也有問(wèn)題,可以看看我的博客中摘錄別人遇到的問(wèn)題  回復(fù)  更多評(píng)論
            

          主站蜘蛛池模板: 古丈县| 象山县| 商水县| 伊通| 竹溪县| 麦盖提县| 廉江市| 福贡县| 镇坪县| 民乐县| 西丰县| 图木舒克市| 吉安县| 民县| 台州市| 高淳县| 安康市| 贵港市| 伊金霍洛旗| 黑龙江省| 格尔木市| 平顶山市| 龙里县| 东丰县| 宁河县| 安达市| 耒阳市| 泽州县| 星子县| 林州市| 广汉市| 越西县| 博客| 巴东县| 凯里市| 扎囊县| 贵阳市| 濮阳市| 安溪县| 阜平县| 抚顺县|