>>分享Java编程技术,对《Java面向对象编程》等书籍提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 28773 个阅读者 刷新本主题
 * 贴子主题:  Java Scoket之java.io.EOFException解决方案 回复文章 点赞(0)  收藏  
作者:flybird    发表时间:2020-01-28 00:01:25     消息  查看  搜索  好友  邮件  复制  引用

   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是根据你要接收内容的大小来确定。


----------------------------
原文链接:https://blog.51cto.com/lavasoft/235269
原作者:熔岩

程序猿的技术大观园:www.javathinker.net



[这个贴子最后由 flybird 在 2020-01-28 17:18:09 重新编辑]
  Java面向对象编程-->Lambda表达式
  JavaWeb开发-->操作符
  JSP与Hibernate开发-->JSP中使用JavaBean(Ⅰ)
  Java网络编程-->Web运作原理(Ⅲ)
  精通Spring-->JPA API的高级用法
  Vue3开发-->映射对象标识符
  [分享]遊藝場開分員會很難嗎?原來工作項目是這些!
  Java小白们的练手大餐:100道编程题面试题精讲(最新推出)
  快速理解 函数式编程,响应式编程,链式编程
  BIO、NIO和AIO的区别、三种IO的原理与用法
  好消息:《精通JPA与Hibernate:Java对象持久化技术详解》出...
  JAVA锁相关知识总结
  整理收集的一些常用java工具类
  用注解去代替if-else的技巧
  面试问我,创建多少个线程合适?我该怎么说
  volatile 实现原理
  Java入门实用代码:集合转数组
  Java入门实用代码:修改链表LinkedList
  Java入门实用代码:删除链表中的元素
  初学者该学哪种编程语言
  Java线程实现龟兔赛跑
  更多...
 IPIP: 已设置保密
楼主      
该用户目前不在线 发货33 
  

威望: 0
级别: 侠客
魅力: 195
经验: 195
现金: 1152
发文章数: 19
注册时间: 0001-01-01
 消息  查看  搜索  好友  邮件  复制  引用


极速飞艇开奖直播
英国乐透8预测开奖
168
用于拍摄特效电影;训练演练类系统则可应用于各种危险环境及一些难以获得作对象或实成本极高的领域,如外科手术训练、空间站维修训练等。如果将该套系统网络化、多机化,使多个用户共享一套虚拟环境,便得到群体—虚拟环境交互式体验系统
发文章时间 2022-11-16 11:16:37
 IPIP: 已设置保密 1 楼     
1页 1条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。