解决DataInputStream read不等于-1,socket文件传输只能传输一个文件无法传输多个问题

 更新时间:2024年08月12日 08:58:30   作者:客 卿  
这篇文章主要介绍了解决DataInputStream read不等于-1,socket文件传输只能传输一个文件无法传输多个问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

被一个朋友问到一个关于sokcet文件传输的问题

他发现他写的代码只能发送一次文件,没办法发送第二次,或者说发送第二次的时候服务端就接收不到了。

部分代码

  // 开始接收文件
                    byte[] bytes = new byte[1024];
                    //byte[] bytes = new byte[dis.available()];
                    int length = 0;
                    while((length = dis.read(bytes, 0, bytes.length)) != -1) {
                    	 System.out.println(bytes.length);
                        fos.write(bytes, 0, length);
                        fos.flush();
                        
                        
                        
                    }
                    System.out.println("======== 文件接收成功 [File Name:" + fileName + "] [Size:" + getFormatFileSize(fileLength) + "] ========");

我给他调试的时候发现确确实实发送第一次文件后就就一直阻塞在while循环里了,出不来。

本来传输完第一次的文件后应该有打印“======== 文件接收成功 [File。。。。。。”

这些信息,但是实际上没有,而且也不报错。

调试的时候打断点也是走着走着断点就不见了,要说他是阻塞也不像是阻塞,因为如果是阻塞的话起码断点是会存在的只是无法往下运行了而已,但是他这个调试就是直接断点就消失了,我也懵了。

后来查资料才发现原来只要客户端的DataOutputStream不close掉,那么服务端的DataInputStream read就永远不等于-1。

即使文件的数据已经传完了,DataInputStream依旧会等着客户端DataOutputStream再传数据过来。

最后只能通过判断文件的的大小来确认文件是否已经传输完成

解决代码代码

  //dis就是DataInputStream
 String fileName = dis.readUTF();//文件名字
                    long fileLength = dis.readLong();//文件长度
                    File directory = new File(savepath);
                    if(!directory.exists()) {
                        directory.mkdir();
                    }
                    File file = new File(directory.getAbsolutePath() + File.separatorChar + fileName);
                    fos = new FileOutputStream(file);
                    // 开始接收文件
                    byte[] bytes = new byte[1024];
                    //byte[] bytes = new byte[dis.available()];
                    int length = 0;
                    while((length = dis.read(bytes, 0, bytes.length)) != -1) {
                    	 System.out.println(bytes.length);
                    	 //fos就是FileOutputStream
                        fos.write(bytes, 0, length);
                        fos.flush();

                       //*************关键的一步**************//
                        if(fileLength == file.length()) break;
                        //***************************//
                    }
                    System.out.println("======== 文件接收成功 [File Name:" + fileName + "] [Size:" + getFormatFileSize(fileLength) + "] ========");

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 完美解决Get和Post请求中文乱码的问题

    完美解决Get和Post请求中文乱码的问题

    下面小编就为大家带来一篇完美解决Get和Post请求中文乱码的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-05-05
  • JavaWeb实战之开发网上购物系统(超详细)

    JavaWeb实战之开发网上购物系统(超详细)

    这篇文章主要介绍了JavaWeb实战之开发网上购物系统(超详细),文中有非常详细的代码示例,对正在学习java的小伙伴们有很好的帮助,需要的朋友可以参考下
    2021-04-04
  • 基于JVM 中常见垃圾收集算法介绍

    基于JVM 中常见垃圾收集算法介绍

    下面小编就为大家分享一篇基于JVM 中常见垃圾收集算法介绍,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • SpringBoot注解@MapperScan的实现

    SpringBoot注解@MapperScan的实现

    @MapperScan是MyBatis和MyBatis-Plus提供的SpringBoot注解,用于自动扫描并注册 Mapper 接口,使其能够被 Spring 容器管理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-05-05
  • java使用poi生成excel的步骤

    java使用poi生成excel的步骤

    2010以上格式使用XSSFWorkBook对象, 2003格式使用HSSFWorkBook对象, 其他对象操作基本一样,本文重点给大家介绍java使用poi生成excel的相关知识,感兴趣的朋友一起看看吧
    2022-04-04
  • Java获取汉字拼音的全拼和首拼实现代码分享

    Java获取汉字拼音的全拼和首拼实现代码分享

    这篇文章主要介绍了Java获取汉字拼音的全拼和首拼实现代码分享,本文直接给出实现代码,需要的朋友可以参考下
    2015-06-06
  • Spring Boot2 整合连接 Redis的操作方法

    Spring Boot2 整合连接 Redis的操作方法

    在Spring Boot中,通过RedisTemplate可以方便地对Redis进行操作,包括设置和获取数据,文章详细介绍了如何配置RedisTemplate,创建RedisConfig类进行自定义配置,并通过Controller访问Redis数据库,感兴趣的朋友一起看看吧
    2025-02-02
  • SpringBoot程序CPU飙升的排查指南

    SpringBoot程序CPU飙升的排查指南

    在生产环境里,大家或多或少都遇到过这种场景:某个 Spring Boot 应用突然 CPU 飙升,打满服务器资源,监控报警狂响,业务接口开始超时,登录服务器,top一看,只能看到是 java 进程在耗 CPU,所以本文给大家介绍了SpringBoot程序CPU飙升的排查指南,需要的朋友可以参考下
    2025-08-08
  • 使用@DS轻松解决动态数据源的问题

    使用@DS轻松解决动态数据源的问题

    这篇文章主要介绍了使用@DS轻松解决动态数据源的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • spring boot系列之集成测试(推荐)

    spring boot系列之集成测试(推荐)

    这篇文章主要介绍了spring boot系列集成测试,需要的朋友可以参考下
    2018-03-03

最新评论