Java Scoket之java.io.EOFException解决方案
来源:互联网 发布:windows正在下载更新 编辑:程序博客网 时间:2024/05/22 14:20
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)
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();
}
......
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是根据你要接收内容的大小来确定
转载:http://lavasoft.blog.51cto.com/62575/235269
0 0
- Java Scoket之java.io.EOFException解决方案
- Java Scoket之java.io.EOFException解决方案
- Java Scoket之java.io.EOFException解决方案
- java.io.EOFException的解决方案
- IOException while loading persisted sessions: java.io.EOFException java.io.EOFException的解决方案
- tomcat异常之java.io.EOFException
- java.io.EOFException翻译
- java.io.EOFException解决
- java.io.EOFException解决
- java.io.EOFException解决
- java.io.EOFException解决
- java.io.EOFException
- java.io.EOFException
- java.io.EOFException解决
- java.io.EOFException解决
- java.io.EOFException错误
- java.io.EOFException解决
- java.io.EOFException解决
- 数据结构图之邻接点
- Adapter的getViewTypeCount和getItemViewType
- iOS后台挂起,网上资源不多,先拷贝下边的研究下
- persistentDrawingCache
- 黑马程序员--java基础--String,StringBuffer,StringBuilde
- Java Scoket之java.io.EOFException解决方案
- Linux grep命令详解
- Nyoj38-布线问题-prim
- android 调用Market 搜索自己的软件
- UML总结——UML与软工的关系
- 解决webservice用Ajax(jquery)传递客户端请求时ip跨域问题(异步域请求)
- The document could not be opened. Could not read archive
- 指针数组和数组指针的区别(一)
- NESASM教程——第十二天——VBlank和中断