Java Scoket之java.io.EOFException解決方案

Java Scoket之java.io.EOFException解決方案
 
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是根據你要接收內容的大小來肯定。
相關文章
相關標籤/搜索