通过java套接字向客户端服务器传输文件

通过java套接字向客户端服务器传输文件,java,sockets,client-server,file-transfer,Java,Sockets,Client Server,File Transfer,我尝试在客户端服务器之间传输文件,如果文件比它发送的数据块大12MB,否则它会正常发送。我的主要问题是每次我传输的内容都比原来的多字节,我需要在完成后使用摘要消息,这样它就不会像现在这样工作,另一个是当我尝试通过网络发送文件时,客户端读取要发送的文件的速度比服务器写入的速度快,因此客户端关闭程序关闭连接,从而损坏文件。我的转账代码如下: 这是客户端传输代码: if(fSize>maxfileSize){ totbLidos = 0; byte[] fB

我尝试在客户端服务器之间传输文件,如果文件比它发送的数据块大12MB,否则它会正常发送。我的主要问题是每次我传输的内容都比原来的多字节,我需要在完成后使用摘要消息,这样它就不会像现在这样工作,另一个是当我尝试通过网络发送文件时,客户端读取要发送的文件的速度比服务器写入的速度快,因此客户端关闭程序关闭连接,从而损坏文件。我的转账代码如下:

这是客户端传输代码:

   if(fSize>maxfileSize){
        totbLidos = 0;
        byte[] fBytes = new byte[fBsize];
        while(totbLidos < fSize){
            int bRemain = (int) f.length() - totbLidos;
            if(bRemain < fBsize){
                fBsize = bRemain;
            }
            int bRead = tFile.read(fBytes, 0, fBsize);
            tServidor.write(fBytes, 0, fBsize);
            tServidor.flush();
            if(bRead>0){
                totbLidos+=bRead;
            }

            System.out.println("Total Bytes Lidos: " + totbLidos);

        }

        tFile.close();
        System.out.println("Ficheiro enviado");
        cliente.close();
    }
    else{
        totbLidos = 0;
        byte[] fBytes = new byte[fSize];
        while(totbLidos < fSize){
            int bRead = tFile.read(fBytes,0,fSize);
            if(bRead>0){
                totbLidos+=bRead;
            }
            tServidor.write(fBytes, 0, fSize);
            System.out.println("Total Bytes Lidos: " + totbLidos);
            tServidor.flush();
        }
        tFile.close();
        System.out.println("Ficheiro enviado");
        cliente.close();
    }
 }
if(fSize > maxfileSize){
            totbLidos = 0;
            DataInputStream tFile = new DataInputStream(cliente.getInputStream());
            BufferedOutputStream fos = new BufferedOutputStream(new FileOutputStream(fName));
            byte[] fBytes = new byte[fBsize];
            while(totbLidos < fSize){
                int bRemain = size - totbLidos;
                if(bRemain < fBsize){
                    fBsize = bRemain;
                }
                int bRead = tFile.read(fBytes, 0, fBsize);
                fos.write(fBytes);
                fos.flush();
                if(bRead>0){
                    totbLidos+=bRead;
                }
                System.out.println("Bytes lidos: " + bRead);
                System.out.println("Total Bytes Escritos: " + totbLidos);
            }
            System.out.println("Ficheiro recebido");

            fos.close();
            tFile.close();
            cliente.close();
            servidor.close();
        }
        else if(fSize < maxfileSize){
            totbLidos = 0;
            DataInputStream tFile = new DataInputStream(cliente.getInputStream());
            BufferedOutputStream fos = new BufferedOutputStream(new FileOutputStream(fName));
            byte[] fBytes = new byte[fSize];
            while(totbLidos < fSize){
                int bRead = tFile.read(fBytes,0,fSize);
                fos.write(fBytes);
                fos.flush();
                if(bRead>0){
                    totbLidos+=bRead;
                }
                System.out.println("Total Bytes Escritos: " + totbLidos);
            }
            System.out.println("Ficheiro recebido");
            fos.close();
            tFile.close();
            cliente.close();
            servidor.close();
        }
}
if(fSize>maxfileSize){
totbLidos=0;
字节[]fBytes=新字节[fBsize];
while(totbLidos0){
totbLidos+=面包;
}
System.out.println(“Lidos:+totbLidos的总字节数”);
}
tFile.close();
System.out.println(“Ficheiro enviado”);
cliente.close();
}
否则{
totbLidos=0;
字节[]fBytes=新字节[fSize];
while(totbLidos0){
totbLidos+=面包;
}
tServidor.write(fBytes,0,fSize);
System.out.println(“Lidos:+totbLidos的总字节数”);
tServidor.flush();
}
tFile.close();
System.out.println(“Ficheiro enviado”);
cliente.close();
}
}
服务器传输代码:

   if(fSize>maxfileSize){
        totbLidos = 0;
        byte[] fBytes = new byte[fBsize];
        while(totbLidos < fSize){
            int bRemain = (int) f.length() - totbLidos;
            if(bRemain < fBsize){
                fBsize = bRemain;
            }
            int bRead = tFile.read(fBytes, 0, fBsize);
            tServidor.write(fBytes, 0, fBsize);
            tServidor.flush();
            if(bRead>0){
                totbLidos+=bRead;
            }

            System.out.println("Total Bytes Lidos: " + totbLidos);

        }

        tFile.close();
        System.out.println("Ficheiro enviado");
        cliente.close();
    }
    else{
        totbLidos = 0;
        byte[] fBytes = new byte[fSize];
        while(totbLidos < fSize){
            int bRead = tFile.read(fBytes,0,fSize);
            if(bRead>0){
                totbLidos+=bRead;
            }
            tServidor.write(fBytes, 0, fSize);
            System.out.println("Total Bytes Lidos: " + totbLidos);
            tServidor.flush();
        }
        tFile.close();
        System.out.println("Ficheiro enviado");
        cliente.close();
    }
 }
if(fSize > maxfileSize){
            totbLidos = 0;
            DataInputStream tFile = new DataInputStream(cliente.getInputStream());
            BufferedOutputStream fos = new BufferedOutputStream(new FileOutputStream(fName));
            byte[] fBytes = new byte[fBsize];
            while(totbLidos < fSize){
                int bRemain = size - totbLidos;
                if(bRemain < fBsize){
                    fBsize = bRemain;
                }
                int bRead = tFile.read(fBytes, 0, fBsize);
                fos.write(fBytes);
                fos.flush();
                if(bRead>0){
                    totbLidos+=bRead;
                }
                System.out.println("Bytes lidos: " + bRead);
                System.out.println("Total Bytes Escritos: " + totbLidos);
            }
            System.out.println("Ficheiro recebido");

            fos.close();
            tFile.close();
            cliente.close();
            servidor.close();
        }
        else if(fSize < maxfileSize){
            totbLidos = 0;
            DataInputStream tFile = new DataInputStream(cliente.getInputStream());
            BufferedOutputStream fos = new BufferedOutputStream(new FileOutputStream(fName));
            byte[] fBytes = new byte[fSize];
            while(totbLidos < fSize){
                int bRead = tFile.read(fBytes,0,fSize);
                fos.write(fBytes);
                fos.flush();
                if(bRead>0){
                    totbLidos+=bRead;
                }
                System.out.println("Total Bytes Escritos: " + totbLidos);
            }
            System.out.println("Ficheiro recebido");
            fos.close();
            tFile.close();
            cliente.close();
            servidor.close();
        }
}
if(fSize>maxfileSize){
totbLidos=0;
DataInputStream tFile=新的DataInputStream(cliente.getInputStream());
BufferedOutputStream fos=新的BufferedOutputStream(新文件输出流(fName));
字节[]fBytes=新字节[fBsize];
while(totbLidos0){
totbLidos+=面包;
}
System.out.println(“字节数lidos:+bRead”);
System.out.println(“总字节数:+totbLidos”);
}
系统输出打印(Ficheiro recebido);
fos.close();
tFile.close();
cliente.close();
servidor.close();
}
else if(fSize0){
totbLidos+=面包;
}
System.out.println(“总字节数:+totbLidos”);
}
系统输出打印(Ficheiro recebido);
fos.close();
tFile.close();
cliente.close();
servidor.close();
}
}

您写入的字节数与此处读取的字节数不同

fos.write(fBytes);
试用

fos.write(fBytes, 0, bRead);

除了@Peter Lawrey answer,我建议您重新使用Apache Commons IO API,以避免将来出现此类错误:

IOUtils.copyLarge(InputStream input, OutputStream output, long inputOffset, long length)