這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)java.net.SocketException四大異常的解決方法,文章內(nèi)容豐富且以專(zhuān)業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
目前成都創(chuàng)新互聯(lián)公司已為上1000+的企業(yè)提供了網(wǎng)站建設(shè)、域名、雅安服務(wù)器托管、網(wǎng)站改版維護(hù)、企業(yè)網(wǎng)站設(shè)計(jì)、嘉蔭網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。
java.net.SocketException如何才能更好的使用呢?這個(gè)就需要我們先要了解有關(guān)這個(gè)語(yǔ)言的相關(guān)問(wèn)題。希望大家有所幫助。那么我們就來(lái)看看有關(guān)java.net.SocketException的相關(guān)知識(shí)。
第1個(gè)異常是 java.net.BindException:Address already in use: JVM_Bind。
該異常發(fā)生在服務(wù)器端進(jìn)行new ServerSocket(port)(port是一個(gè)0,65536的整型值)操作時(shí)。異常的原因是以為與port一樣的一個(gè)端口已經(jīng)被啟動(dòng),并進(jìn)行監(jiān)聽(tīng)。此時(shí)用netstat –an命令,可以看到一個(gè)Listending狀態(tài)的端口。只需要找一個(gè)沒(méi)有被占用的端口就能解決這個(gè)問(wèn)題。
第2個(gè)異常是java.net.SocketException: Connection refused: connect。
該異常發(fā)生在客戶端進(jìn)行 new Socket(ip, port)操作時(shí),該異常發(fā)生的原因是或者具有ip地址的機(jī)器不能找到(也就是說(shuō)從當(dāng)前機(jī)器不存在到指定ip路由),或者是該ip存在,但找不到指定的端口進(jìn)行監(jiān)聽(tīng)。出現(xiàn)該問(wèn)題,首先檢查客戶端的ip和port是否寫(xiě)錯(cuò)了,如果正確則從客戶端ping一下服務(wù)器看是否能ping通,如果能ping通(服務(wù)服務(wù)器端把ping禁掉則需要另外的辦法),則看在服務(wù)器端的監(jiān)聽(tīng)指定端口的程序是否啟動(dòng),這個(gè)肯定能解決這個(gè)問(wèn)題。
第3個(gè)異常是java.net.SocketException: Socket is closed,
該異常在客戶端和服務(wù)器均可能發(fā)生。異常的原因是己方主動(dòng)關(guān)閉了連接后(調(diào)用了Socket的close方法)再對(duì)網(wǎng)絡(luò)連接進(jìn)行讀寫(xiě)操作。
第4個(gè)異常是java.net.SocketException: (Connection reset或者Connect reset by peer:Socket write error)。
該異常在客戶端和服務(wù)器端均有可能發(fā)生,引起該異常的原因有兩個(gè),***個(gè)就是如果一端的Socket被關(guān)閉(或主動(dòng)關(guān)閉或者因?yàn)楫惓M顺龆鸬年P(guān)閉),另一端仍發(fā)送數(shù)據(jù),發(fā)送的***個(gè)數(shù)據(jù)包引發(fā)該異常(Connect reset by peer)。另一個(gè)是一端退出,但退出時(shí)并未關(guān)閉該連接,另一端如果在從連接中讀數(shù)據(jù)則拋出該異常(Connection reset)。簡(jiǎn)單的說(shuō)就是在連接斷開(kāi)后的讀和寫(xiě)操作引起的。
第5個(gè)異常是java.net.SocketException: Broken pipe。
該異常在客戶端和服務(wù)器均有可能發(fā)生。在第4個(gè)異常的***種情況中(也就是拋出 SocketExcepton:Connect reset by peer:Socket write error后),如果再繼續(xù)寫(xiě)數(shù)據(jù)則拋出該異常。前兩個(gè)異常的解決方法是首先確保程序退出前關(guān)閉所有的網(wǎng)絡(luò)連接,其次是要檢測(cè)對(duì)方的關(guān)閉連接操作,發(fā)現(xiàn)對(duì)方關(guān)閉連接后自己也要關(guān)閉該連接。
編寫(xiě)網(wǎng)絡(luò)程序時(shí)需要注意的問(wèn)題
第1個(gè)問(wèn)題是要正確區(qū)分長(zhǎng)、短連接。所謂的長(zhǎng)連接是一經(jīng)建立就***保持。短連接就是在以下場(chǎng)景下,準(zhǔn)備數(shù)據(jù)—>建立連接— >發(fā)送數(shù)據(jù)—>關(guān)閉連接。很多的程序員寫(xiě)了多年的網(wǎng)絡(luò)程序,居然不知道什么是長(zhǎng)連接,什么是短連接。
第2個(gè)問(wèn)題是對(duì)長(zhǎng)連接的維護(hù)。所謂的維護(hù)包括兩個(gè)方面,首先是檢測(cè)對(duì)方的主動(dòng)斷連(既調(diào)用 Socket的close方法),其次是檢測(cè)對(duì)方的宕機(jī)、異常退出及網(wǎng)絡(luò)不通。這是一個(gè)健壯的通信程序必須具備的。檢測(cè)對(duì)方的主動(dòng)斷連很簡(jiǎn)單,主要一方主動(dòng)斷連,另一方如果在進(jìn)行讀操作,則此時(shí)的返回值只-1,一旦檢測(cè)到對(duì)方斷連,則應(yīng)該主動(dòng)關(guān)閉己方的連接(調(diào)用Socket的close方法)。
而檢測(cè)對(duì)方的宕機(jī)、異常退出及網(wǎng)絡(luò)不通常用方法是用“心跳”,也就是雙方周期性的發(fā)送數(shù)據(jù)給對(duì)方,同時(shí)也從對(duì)方接收“心跳”,如果連續(xù)幾個(gè)周期都沒(méi)有收到對(duì)方心跳,則可以判斷對(duì)方或者宕機(jī)或者異常推出或者網(wǎng)絡(luò)不通,此時(shí)也需要主動(dòng)關(guān)閉己方連接,如果是客戶端可在延遲一定時(shí)間后重新發(fā)起連接。雖然Socket有一個(gè)keep alive選項(xiàng)來(lái)維護(hù)連接,如果用該選項(xiàng),一般需要兩個(gè)小時(shí)才能發(fā)現(xiàn)對(duì)方的宕機(jī)、異常退出及網(wǎng)絡(luò)不通。
第3個(gè)問(wèn)題是處理效率問(wèn)題。不管是客戶端還是服務(wù)器,如果是長(zhǎng)連接一個(gè)程序至少需要兩個(gè)線程,一個(gè)用于接收數(shù)據(jù),一個(gè)用于發(fā)送心跳,寫(xiě)數(shù)據(jù)不需要專(zhuān)門(mén)的線程,當(dāng)然另外還需要一類(lèi)線程(俗稱(chēng)Worker線程)用于進(jìn)行消息的處理,也就是說(shuō)接收線程僅僅負(fù)責(zé)接收數(shù)據(jù),然后再分發(fā)給Worker進(jìn)行數(shù)據(jù)的處理。如果是短連接,則不需要發(fā)送心跳的線程,如果是服務(wù)器還需要一個(gè)專(zhuān)門(mén)的線程負(fù)責(zé)進(jìn)行連接請(qǐng)求的監(jiān)聽(tīng)。這些是一個(gè)通信程序的整體要求,具體怎么設(shè)計(jì)你的程序,就看你自己的設(shè)計(jì)水平了。
上述就是小編為大家分享的java.net.SocketException四大異常的解決方法了,如果剛好有類(lèi)似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。