5

Javaを使用して、あるコンピューターから別のコンピューターにファイルを送信しようとしています。私は以下のコードを書きました。送信者と受信者の両方が同じコンピューターで起動されている場合は正常に動作しますが、異なるマシンで動作している場合、受信したファイルサイズは元のファイルよりも大きく、破損しています。

注:最大10MBのファイルを転送しようとしています。

どうすればこれを修正できますか?

送信者:

ServerSocket server_socket = new ServerSocket(8989);
File myFile = new File(myPath);

Socket socket = server_socket.accept();
int count;
byte[] buffer = new byte[1024];

OutputStream out = socket.getOutputStream();
BufferedInputStream in = new BufferedInputStream(new FileInputStream(myFile));
while ((count = in.read(buffer)) > 0) {
     out.write(buffer, 0, count);
     out.flush();
}
socket.close();

受信者:

Socket socket = new Socket(address, 8989);
FileOutputStream fos = new FileOutputStream(anotherPath);
BufferedOutputStream out = new BufferedOutputStream(fos);
byte[] buffer = new byte[1024];
int count;
InputStream in = socket.getInputStream();
while((count=in.read(buffer)) >0){
    fos.write(buffer);
}
fos.close();
socket.close();
4

3 に答える 3

23

クライアント側では、最大 countバイト数を書き込んで送信します。

while ((count = in.read(buffer)) > 0) {
  out.write(buffer, 0, count);

サーバー側では、最大 countバイトを読み取りますが、バッファー全体をファイルに書き込みます。

while((count=in.read(buffer)) > 0){
  fos.write(buffer);

次のように変更するだけです。

fos.write(buffer, 0, count);

そして、あなたは安全な側にいるでしょう。ところで、あなたのプログラムには別の小さなバグがあります:終了することを意味しないread()戻ることができます。代わりに使用してください:0InputStream>=

count = in.read(buffer)) >= 0

IOUtils.copy(InputStream, OutputStream)Apache Commonsから検討しましたか?whileループ全体が次のようになります。

OutputStream out = socket.getOutputStream();
InputStream in = new FileInputStream(myFile);
IOUtils.copy(in, out);
socket.close();

書くコードが少なく、テストするコードが少ない。また、バッファリングは内部で行われます。

于 2012-11-25T21:31:22.203 に答える
3

in.read(buffer)必ずしもバッファ全体が新しいデータでいっぱいになるとは限らないことに注意してください。したがって、バッファ全体を書き込まないようにする必要があります。変化する

while((count=in.read(buffer)) >0){
    fos.write(buffer);
}

while((count=in.read(buffer)) >0){
    fos.write(buffer, 0, count);
}
于 2012-11-25T21:31:20.487 に答える
1

送信者

Socket sock = new Socket("127.0.0.1", 5991);
        System.out.println("Connecting.........");
        File myFile = new File("/root/qrcode/");
        File[] files = myFile.listFiles();
       OutputStream os = sock.getOutputStream();
        BufferedOutputStream bos = new BufferedOutputStream(os);
                            DataOutputStream dos = new DataOutputStream(bos);

                            dos.writeInt(files.length);
                            long totalBytesRead = 0;
                            int percentCompleted = 0;
                            for(File file : files)
                            {
                                     long length = file.length();
                                     dos.writeLong(length);

                                     String name = file.getName();
                                     dos.writeUTF(name);

                                     FileInputStream fis = new FileInputStream(file);
                                     BufferedInputStream bis = new BufferedInputStream(fis);

                                     int theByte = 0;
                                     while((theByte = bis.read()) != -1)
                                     {
                                        totalBytesRead += theByte;


                                        bos.write(theByte);
                                     }
                                    //  System.out.println("file read");
                                     bis.close();
                                 }

                                dos.close();


        //Closing socket  
        sock.close();

レシーバー

ServerSocket serverSocket = new ServerSocket(5991);  

    while(true) {  
        Socket clientSocket = null; 
        System.out.println("Starting...");
        clientSocket = serverSocket.accept();  

        InputStream in = clientSocket.getInputStream(); //used

        BufferedInputStream bis = new BufferedInputStream(in);

        String dirPath  ;
        dirPath = "/root/NewFolder";

        try{
            DataInputStream dis = new DataInputStream(bis);

            int filesCount = dis.readInt();
            File[] files = new File[filesCount];
            long f_l = 0;
            int count =0 ;
            long totalBytesRead = 0;
            int percentCompleted = 0;

            for(int i = 0; i < filesCount; i++)
            {
                long fileLength = dis.readLong();
                String fileName = dis.readUTF();

                f_l = f_l +fileLength;
                files[i] = new File(dirPath + "/" + fileName);

                FileOutputStream fos = new FileOutputStream(files[i]);
                BufferedOutputStream bos = new BufferedOutputStream(fos);

                int tot = 0;
                for(int j = 0; j < fileLength; j++) {

                    bos.write(bis.read());
                }

                bos.close();

            }

        }catch(Exception ex)
        {
            System.out.println("error in socket programming ");
        }
    }
于 2016-06-01T12:16:58.007 に答える