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