Java Socket 網絡編程常見異常
原文:https://blog.csdn.net/xyz_lmn/article/details/7901474
1.java.net.SocketTimeoutException.這個異常比較常見,socket超時。一般有2個地方會拋出這個,一個是connect的時候,這個超時參數由connect(SocketAddress endpoint,int timeout)中的後者來決定,還有就是setSoTimeout(int
timeout),這個是設定讀取的超時時間。它們設置成0均表示無限大。
2.java.net.BindException:Address already in use: JVM_Bind。該異常發生在服務器端進行new ServerSocket(port) 或者socket.bind(SocketAddress bindpoint)操作時。
原因:與port一樣的一個端口已經被啟動,並進行監聽。此時用netstat –an命令,可以看到一個Listending狀態的端口。隻需要找一個沒有被占用的端口就能解決這個問題。
3.java.net.ConnectException: Connection refused: connect。該異常發生在客戶端進行new Socket(ip, port)或者socket.connect(address,timeout)操作時.
原因:指定ip地址的機器不能找到(也就是說從當前機器不存在到指定ip路由),或者是該ip存在,但找不到指定的端口進行監聽。應該首先檢查客戶端的ip和port是否寫錯了,假如正確則從客戶端ping一下服務器看是否能ping通,假如能ping通(服務服務器端把ping禁掉則需要另外的辦法),則看在服務器端的監聽指定端口的程序是否啟動。
4.java.net.SocketException: Socket is closed,該異常在客戶端和服務器均可能發生。異常的原因是己方主動關閉了連接後(調用了Socket的close方法)再對網絡連接進行讀寫操作。
5.java.net.SocketException: Connection reset或者Connect reset by peer:Socket write error。該異常在客戶端和服務器端均有可能發生,引起該異常的原因有兩個,第一個就是假如一端的Socket被關閉(或主動關閉或者因為異常退出而引起的關閉),另一端仍發送數據,發送的第一個數據包引發該異常(Connect reset by peer)。另一個是一端退出,但退出時並未關閉該連接,另一端假如在從連接中讀數據則拋出該異常(Connection
reset)。簡單的說就是在連接斷開後的讀和寫操作引起的。
對於服務器,一般的原因可以認為:
a) 服務器的並發連接數超過了其承載量,服務器會將其中一些連接主動Down掉.
b) 在數據傳輸的過程中,瀏覽器或者接收客戶端關閉了,而服務端還在向客戶端發送數據。
6.java.net.SocketException: Broken pipe。該異常在客戶端和服務器均有可能發生。在拋出SocketExcepton:Connect reset by peer:Socket write error後,假如再繼續寫數據則拋出該異常。前兩個異常的解決方法是首先確保程序退出前關閉所有的網絡連接,其次是要檢測對方的關閉連接操作,發現對方關閉連接後自己也要關閉該連接。
對於4和5這兩種情況的異常,需要特別注意連接的維護。在短連接情況下還好,如果是長連接情況,對於連接狀態的維護不當,則非常容易出現異常。基本上對長連接需要做的就是:
a) 檢測對方的主動斷連(對方調用了Socket的close方法)。因為對方主動斷連,另一方如果在進行讀操作,則此時的返回值是-1。所以一旦檢測到對方斷連,則主動關閉己方的連接(調用Socket的close方法)。
b) 檢測對方的宕機、異常退出及網絡不通,一般做法都是心跳檢測。雙方周期性的發送數據給對方,同時也從對方接收“心跳數據”,如果連續幾個周期都沒有收到對方心跳,則可以判斷對方或者宕機或者異常退出或者網絡不通,此時也需要主動關閉己方連接;如果是客戶端可在延遲一定時間後重新發起連接。雖然Socket有一個keep alive選項來維護連接,如果用該選項,一般需要兩個小時才能發現對方的宕機、異常退出及網絡不通。
7.java.net.SocketException: Too many open files
原因: 操作係統的中打開文件的最大句柄數受限所致,常常發生在很多個並發用戶訪問服務器的時候。因為為了執行每個用戶的應用服務器都要加載很多文件(new一個socket就需要一個文件句柄),這就會導致打開文件的句柄的缺乏。
解決方式:
a) 盡量把類打成jar包,因為一個jar包隻消耗一個文件句柄,如果不打包,一個類就消耗一個文件句柄。
b) java的GC不能關閉網絡連接打開的文件句柄,如果沒有執行close()則文件句柄將一直存在,而不能被關閉。也可以考慮設置socket的最大打開數來控製這個問題。對操作係統做相關的設置,增加最大文件句柄數量。ulimit -a可以查看係統目前資源限製,ulimit -n 10240則可以修改,這個修改隻對當前窗口有效。
最後更新:2017-04-03 20:51:32
上一篇:
設計模式之代理模式
下一篇:
老板,請尊重您的技術人員
從你王者榮耀愛玩的英雄類型,我就知道你關注哪些技術領域!
一道麵試題:比較兩個集合是否相等?
展開關於紅警,大家在熱議 紅警2共和國(水樹奈(閆(中華人民共和國稅收征收管理法(主席令第四十九號) 2015年8月15日 - 會關於修改〈中華人民共和國文物保護法〉等十二部法律的決定》(主席令第...第八十九條 納稅人、扣繳義務人可以委托稅務代理人代為辦
poj 1613 Cave Raider 最短路
PostgreSQL全角、半角互相轉換
asp.net中DropDownList添加“請選擇”提示
Javascript中的prototype
初識視覺SLAM:用相機解決定位和建圖問題
《計算機存儲與外設》----第1章 Computer Organization and Architecture: Themes and Variations Cache存儲器和虛擬存儲器 1.1 Cache存儲器概述
'Ext.EventObject' 為空或不是對象的錯誤原因和解決方法