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

ocket接收数据的时候,常常会抛出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是根据你要接收内容的大小来确定。
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值