博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java Scoket之java.io.EOFException解决方案
阅读量:7118 次
发布时间:2019-06-28

本文共 1470 字,大约阅读时间需要 4 分钟。

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是根据你要接收内容的大小来确定。
本文转自 leizhimin 51CTO博客,原文链接:http://blog.51cto.com/lavasoft/235269,如需转载请自行联系原作者
你可能感兴趣的文章
解析nodeJS模块源码 亲手打造基于ES6的观察者系统
查看>>
77% 的网站使用了至少有 1 个漏洞的 JavaScript 库
查看>>
ES5新增 数组操作forEach()、map()、filter()、some()、every()
查看>>
一个可以提高开发效率的Git命令-- Cherry-Pick
查看>>
IBM发表论文:可能已找到处理量子计算退相干的方法
查看>>
.NET Core 3.0中的数据库驱动框架System.Data
查看>>
Firefox Quantum支持跨浏览器插件架构
查看>>
Oracle收购Talari,第一家SD-WAN公有云提供商出现
查看>>
数据库设计中的9大常见错误
查看>>
当我们在谈大前端的时候,我们谈的是什么
查看>>
柔性自动化在物流的应用及探索
查看>>
区块链和数据科学:如果同时应用这两种技术,将会实现什么?
查看>>
es动态index查询
查看>>
将敏捷应用于工业机械开发
查看>>
有赞HBase技术实践:读流程解析与优化
查看>>
微软最具价值技术专家:我的16年软件开发经验总结
查看>>
腾讯云+未来高峰对话:智能+时代的创新与探索
查看>>
C# 8中的默认接口方法
查看>>
实现TeX的算法:回首编程技术的过去三十年
查看>>
京东构建了全球最大的Kubernetes集群,没有之一
查看>>