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是根據你要接收內容的大小來確定。


免責聲明!

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



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