首頁>技術>

Socket接收資料的時候,常常會丟擲java.io.EOFException異常,也沒有明確的原因和提示,在網上搜搜,很多人都在問此問題,但是沒有找到切實可行的辦法。經過研究,問題解決了。

看到的異常堆疊資訊如下:

java.io.EOFException at java.io.DataInputStream.readFully(DataInputStream.java:178) at java.io.DataInputStream.readUTF(DataInputStream.java:565) at java.io.DataInputStream.readUTF(DataInputStream.java:522)

Java對此的解釋也很模糊:

public class EOFExceptionextends IOException當輸入過程中意外到達檔案或流的末尾時,丟擲此異常。 此異常主要被資料輸入流用來表明到達流的末尾。注意,其他許多輸入操作返回一個特殊值表示到達流的末尾,而不是丟擲異常。

從上面的提示可以模糊看到,因為不知道流的末尾,當到達末尾的時候,自然丟擲了此異常。既然不知道結尾如何,乾脆設一個快取,然後讀取一批資料後輸出即可。

為了保險期間,可以講此快取設定大點,一次可以完全接收到想要的內容,這樣,一次就可以讀取到所要的內容了,避免了迴圈獲取。下面將此程式碼放出來:

...... private static final int BUFFER_SIZE=1024*1024; ...... Socket socket = new Socket(cfg.getIp(), Integer.parseInt(SysParamsToolkit.getProperty("socketport"))); String charset = SysParamsToolkit.getProperty("socke.rexml.charset"); //Socket傳送的字符集編碼 try { OutputStream dos = socket.getOutputStream(); dos.write(xmlcmd.getBytes(charset)); dos.flush(); DataInputStream dis = new DataInputStream(socket.getInputStream()); char[] data = new char[BUFFER_SIZE]; BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream(), charset)); int len = br.read(data); String rexml = String.valueOf(data, 0, len); //接收一個字串資料 } catch (Exception e) { return false; } finally { if (socket.isConnected()) socket.close(); } ......

經過上面的處理後,就沒問題了。

快取的大小BUFFER_SIZE是根據你要接收內容的大小來確定。

9
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 跟光磊學Java開發-Java併發程式設計入門