• 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是根据你要接收内容的大小来确定。
  • 相关阅读:
    深入理解C++的动态绑定和静态绑定
    【转载】“惊群”,看看nginx是怎么解决它的
    352. Data Stream as Disjoint Intervals
    lambda
    auto
    sizeof(类)
    private是自己私有的,protected是可以让孩子知道的,public是公开的
    【转载】C++ typedef用法小结
    string char * const char *之间的互相转换
    【转载】Web Service 的工作原理
  • 原文地址:https://www.cnblogs.com/interdrp/p/5606788.html
Copyright © 2020-2023  润新知