一個客戶端連接服務器的小程序,服務器端可以正常讀取客戶端發來的數據
但是當客戶端關閉時,服務端也關閉了,並且拋出如下的異常:
java.io.EOFException at java.io.DataInputStream.readUnsignedShort(DataInputStream.java:323) at java.io.DataInputStream.readUTF(DataInputStream.java:572) at java.io.DataInputStream.readUTF(DataInputStream.java:547) at ChatServer.main(ChatServer.java:17)
服務器端的代碼如下:
import java.io.*; import java.net.*;
public class ChatServer {
public static void main(String[] args) { try{ ServerSocket ss=new ServerSocket(7889); while(true){ Socket s=ss.accept(); DataInputStream dis=new DataInputStream(s.getInputStream()); while(true){ String str=dis.readUTF(); System.out.println(str); } } }catch(IOException e){ e.printStackTrace(); } } }
產生異常位於: String str=dis.readUTF();
以前也遇到過這種問題,在流傳輸過程中是不允許被並發訪問的。所以數據能接連不斷的傳過來,其 實有很多人在運行的時候都會碰到EOFException, 然后百思不得其解,去各種論壇問解決方案。其實我想說,這個異常不是必須聲明的,也就是說它雖然是異常,但其實是正常運行結束的標志。EOF表示讀到了文 件尾( String str = dis.readUTF(); ,客戶端已經斷開,后面已經沒有內容可以讀了),發送結束自然連接也就斷開了。
如果這影響到了你socket程序的正確性的話,請靜下心來看看自己程序的業務邏輯,而不 要把注意力聚集在發送和接受的方法上。因為我也被這樣的bug困擾了1整天,被很多論壇的帖子誤解了很多次最后得出的教訓。如果在while循環中去 readUTF() ,本質上是沒有問題的,有數據來就會讀,沒有就自動阻塞。那么拋出EOFException一定是因為連接斷了還在繼續read,什么原因導致連接斷了 呢?一定是業務邏輯哪里存在錯誤,比如NullPoint、 ClassCaseException、ArrayOutofBound,即使程序較大也沒關系,最多只要單步調適一次就能很快發現bug並且解決它。
那么是屬於哪一種呢?當然是第一種,因為你客戶端已經被你斷開,所以你應該怎么做呢
你可以捕捉這個客戶端斷開的異常EOFExcption,然后做你需要的處理,try ... catch(EOFException){ System.out.println("這是合法的,客戶端已經關閉");}
客戶端每次在傳輸完數據后,再傳輸一個null過去,就行了。不然就報EOF異常。
源文:http://anwj336.blog.163.com/blog/static/8941520920087732313926/