java.sql.SQLException: Io 異常: Software caused connection abort: socket write error
今天寫了一個廣播程式,用java測試的時候沒有什麼問題,但是用flash的用戶端測試點時候就報下面的錯誤,想了很長時間也找不出問題的原因。 原來是flash軟體在測試的時候不像java用戶端一樣,每開啟一個新的用戶端串連的時候就自動建立一個新的線程。flash是每重新啟動一個新的用戶端的串連的時候就會把上次啟動的用戶端的串連給關閉,也就是說在將上次的socket關掉。這樣java伺服器在向用戶端發送資訊的時候,用戶端的串連已經關掉,所以自然就無法接收該資訊,導致java提示“connection abort”錯誤,進而也就無法進行寫操作了。所以這個異常出現的原因就是用戶端非正常關閉,或者是由於網路的問題使用者掉線,而產生該異常,因此在java伺服器端就應該即時的檢測用戶端的串連狀況,無論是什麼原因導致使用者掉線,都要將該使用者從使用者線上列表中刪除,否則伺服器就無法正常工作,嚴重的時候可能導致伺服器的因為阻塞而死掉,這是應該注意到問題。
解決該問題的最好辦法就是時時檢測線上使用者的串連情況,一旦發現用串連出現問題,立即強制該使用者推出線上使用者列表,也即將其刪除出要廣播的使用者隊列中。這樣就可以保證在伺服器廣播的時候不會由於使用者的非正常退出而導致伺服器端出現工作的異常。
下面是該異常的詳細資料:
java.sql.SQLException: Io 異常: Software caused connection abort: socket write error:
java.net.SocketException: Software caused connection abort: socket write error at java.net.SocketOutputStream.socketWrite0(Native Method) at java.net.SocketOutputStream.socketWrite(Unknown Source) at java.net.SocketOutputStream.write(Unknown Source) at com.toplx.game.server.SendMessage.sendObject(SendMessage.java:40) at com.toplx.game.server.BroadcastMsg.sendMsgToAll(BroadcastMsg.java:42) at com.toplx.game.server.GameThread.run(GameThread.java:53) at java.lang.Thread.run(Unknown Source) |