相关文章推荐
博学的绿茶  ·  OpenCvSharp.OpenCvShar ...·  16 小时前    · 
失恋的铁板烧  ·  vue3 + ts +vant ...·  1 周前    · 
坚强的大蒜  ·  js ...·  3 月前    · 
无邪的大熊猫  ·  html ...·  1 年前    · 
// 开始接收文件 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) + "] ========");
                    最近被一个朋友问答一个关于sokcet文件传输的问题,他发现他写的代码只能发送一次文件,没办法发送第二次,或者说发送第二次的时候服务端就接收不到了。部分代码如下  // 开始接收文件                    byte[] bytes = new byte[1024];                    //byte[] bytes = new byte[dis.available()];                    int length = 0;          
				
在使用DataInputStream时候,经常会使用到readUTF来读取一段字符串,但是readUTF是如何知道该字符串有多长的呢? 下面的例子是对DataInputStream的简单使用: package s1; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io...
问题1:如何解决socket中如何处理DatainputStreamread方法读取堵塞?如果没有长时间数据进来如何让线程运行结束呢?大家看下代码哦,然后说下如何处理呢? 代码如下: Socket 的 setSoTimeout() 方法必须在接收数据之前执行才有效. 此外, 当输入流的 read()方法抛出 SocketTimeoutException 后, Socket 仍然是连接的, 可
DataInputStream 是用来装饰其它输入流,它允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。 要想使用数据输入流,则肯定要用户指定数据的保存格式。必须按指定的格式保存数据,才可以将数据输入流将数据读取进来。 一、继承关系与初始化方式 二、方法列举 读取方法一: int read(byte b[]):从包含的输入流中读取一定数量的字节,并将它们存储到缓冲区数组 ...
DataInputStreamreadBoolean()方法 (DataInputStream Class readBoolean() method) readBoolean() method is available in java.io package. readBoolean()方法在java.io包中可用。 readBoolean() method is used to check...
Java网络编程时出现java.io.DataInputStream.readInt(Unknown Source),且输出的数据乱码。 为了可以传送int型的数据,用的DataOutputStream类来传送,接收端用的是num = dis.readInt()一直乱码,原因是发送端未使用dos.writeInt(num)。 正确代码如下: package network; import java.io.DataInputStream; import java.io.IOException; // 数据输入流: DataInputStream // DataInputstream (InputStream in) // 数据输出流: Da taOutputStream // DataOutputStream (OutputStream out ) package cn.study_01; import java.io.*; public class DateStreamDemo { publi
// 创建ServerSocket对象,并监听端口 ServerSocket server = new ServerSocket(8888); System.out.println("等待接收文件..."); // 阻塞,等待客户端发送文件 Socket socket = server.accept(); System.out.println("文件传输开始..."); // 创建输入流,从Socket中读取数据 DataInputStream dis = new DataInputStream(socket.getInputStream()); // 读取文件名和文件长度 String fileName = dis.readUTF(); long fileLength = dis.readLong(); System.out.println("文件名:" + fileName); System.out.println("文件长度:" + fileLength); // 创建输出流,将接收到的文件写入磁盘 FileOutputStream fos = new FileOutputStream(new File(fileName)); // 创建缓冲区并读取文件内容,写入到磁盘中 byte[] buffer = new byte[1024]; int length = 0; while ((length = dis.read(buffer)) > 0) { fos.write(buffer, 0, length); // 关闭流和Socket fos.close(); dis.close(); socket.close(); server.close(); System.out.println("文件传输完成!"); } catch (IOException e) { e.printStackTrace(); 该代码创建了一个ServerSocket,并监听端口8888。当客户端连接上来时,使用DataInputStreamSocket中读取文件名和文件长度,并将接收到的文件写入磁盘中。 2. 发送端代码 ```java import java.io.*; import java.net.Socket; public class Sender { public static void main(String[] args) { try { // 创建Socket对象并连接到目标主机 Socket socket = new Socket("192.168.0.10", 8888); // 创建输出流,将文件发送到Socket中 File file = new File("D:/test.txt"); DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); // 将文件名和长度写入Socket中 dos.writeUTF(file.getName()); dos.writeLong(file.length()); System.out.println("文件名:" + file.getName()); System.out.println("文件长度:" + file.length()); // 创建输入流并读取文件内容,发送到Socket中 FileInputStream fis = new FileInputStream(file); byte[] buffer = new byte[1024]; int length = 0; while ((length = fis.read(buffer)) > 0) { dos.write(buffer, 0, length); // 关闭流和Socket fis.close(); dos.close(); socket.close(); System.out.println("文件发送完成"); } catch (IOException e) { e.printStackTrace(); 该代码创建了一个Socket对象,并连接到指定的主机和端口。然后使用DataOutputStream将文件名和文件长度发送到Socket中,并将文件内容发送到Socket中。最后关闭流和Socket