木目丶人言 发表于 2020-8-17 22:01:36

通过socket完成zip文件的网络传输,但是传输过去会出现文件损坏。

本帖最后由 木目丶人言 于 2020-8-18 11:08 编辑

遇到的问题:我定义了一个字节数组data: byte[],用来暂存读取的字节数据, 当这个字节数组的大小设置为8192时传输的文件没有问题,8192字节应该是BufferedInputStream和BufferedOutputStream的默认缓存大小。当我吧这个字节数组的大小定义为非8192的数时传输的文件就会出现文件损坏,使用BufferedInputStream(socket.getInputStream(), databig)和BufferedOutputStream(socket.getOutputStream(), databig);这两个构造函数时应该已经把默认的缓存大小更改了,但是传输依然出现文件损坏。到这里我就不知道是哪里出错了,如果是因为缓存大小与我定义的字节数组大小不合适的话,那在我修改默认缓存大小后应该能正常传输才对,但是并非如此。请求大神讲解一下,谢谢。


接收端代码:
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Receive {
        final static String name = "E:\\2.zip";//接收文件储存位置
        final static int port = 9999;
        final static int databig = 8192;
       
        public static void main(String[] args){
                File file = new File(name);
                byte[] data = new byte;
                long big = 0;
                long count = 0;
               
                try {
                        ServerSocket server = new ServerSocket(port);
                        System.out.println("等待发送端连接");
                        Socket socket = server.accept();
                        System.out.println("连接成功");
                        file.createNewFile();
                        FileOutputStream out = new FileOutputStream(file);
                        BufferedInputStream in = new BufferedInputStream(socket.getInputStream(), databig);
                        DataInputStream in2 = new DataInputStream(socket.getInputStream());
                        //接收文件大小
                        big = in2.readLong();
                        System.out.println(big);
                       
                        while(true)
                        {                               
                                in.read(data, 0, data.length);
                                out.write(data, 0, data.length);
                                System.out.println((count*1.0/big*1.0)*100);       
                                count+=databig;
                        }                       
                }
                catch (Exception e) {
                        System.out.println(e.toString());
                }
                System.out.println("接收成功");
        }
}

发送端代码:
import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.net.Socket;

public class Send {
        final static String name = "E:\\2.zip";
        final static String ip = "19.168.43.01";
        final static int port = 9999;
        final static int filebig = 8192;
       
        public static void main(String[] args) {       
                File file = new File(name);
                long big = file.length();
                System.out.printf("文件总大小(Byte): ");
                System.out.println(big);
                byte[] data = new byte;
                long count = 0;
               
                try {
                        Socket socket = new Socket(ip, port);
                        FileInputStream in = new FileInputStream(file);
                        BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream(), filebig);
                        DataOutputStream out2 = new DataOutputStream(socket.getOutputStream());               
                        //发送文件大小
                        out2.writeLong(big);
                        out2.flush();
                                       
                        while(in.read(data, 0, data.length) != -1)
                        {
                                System.out.printf("发送文件百分比:");
                                System.out.println((count*1.0/big*1.0)*100);
                                out.write(data, 0, data.length);
                                out.flush();
                                count+=filebig;
                        }

                        System.out.println("发送成功");
                }
                catch (Exception e) {
                        e.printStackTrace();
                }
        }
}

木目丶人言 发表于 2020-8-18 21:55:35

已经知道原因了,谢谢。

木目丶人言 发表于 2020-8-18 21:57:51

已经知道原因了,是因为在写入文件的过程中因为定义的字节数组在最后一轮传输时会出现没有写满数据的情况,需要对字节数组内的信息进行判断再写入文件,否则最后文件会出现很多null。
页: [1]
查看完整版本: 通过socket完成zip文件的网络传输,但是传输过去会出现文件损坏。