socket編程報異常java.io.EOFException


一個客戶端連接服務器的小程序,服務器端可以正常讀取客戶端發來的數據

但是當客戶端關閉時,服務端也關閉了,並且拋出如下的異常:

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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM