2

これは私の最初の質問です。私は何時間も自分自身を助けるために検索しましたが、インターネット上に解決策はありません. 「System.out.println()」を挿入した場合にのみプログラムが実行されます。tcp を使用して大きなファイル (mp3、5Mb) を転送したいです。私はJavaでの作業に多くの経験がありますが、これは非常に興味深い失敗です.

サーバーとクライアントは 128.0.0.1 です

これはクライアント用の私のコードです

public void receive(int port) {
        try {
            ServerSocket s = new ServerSocket(port);
            Socket socket = s.accept();
            BufferedInputStream in = new BufferedInputStream(
                    socket.getInputStream());
            FileOutputStream fileOut = new FileOutputStream("dateiname.mp3");

            startzeit = Calendar.getInstance().getTimeInMillis();

            byte[] b = new byte[32];
            while (in.available() > 0) {
                System.out.println(Calendar.getInstance().getTimeInMillis()
                        - startzeit);
                in.read(b);
                fileOut.write(b);
                fileOut.flush();
                received += 1;
            }
            System.out.println("Feritg");
            fileOut.close();
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

そして、サーバー

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;

public class FileTransfer {
    @SuppressWarnings("resource")
    public static void send(File datei, InetAddress ip, int port)
            throws IOException 
        {
        Socket socket = new Socket(ip, port);
        BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream());
        FileInputStream fileIn = new FileInputStream(datei);
        while (fileIn.available() > 0) {
            byte[] b = new byte[32];
            fileIn.read(b);
            out.write(b);
            out.flush();
        }
        out.close();
        socket.close();
    }
}

そして、少なくともサーバーによる例外はあります

Exception in thread "main" java.net.SocketException: Connection reset by peer: socket write error
 at java.net.SocketOutputStream.socketWrite0(Native Method)
 at java.net.SocketOutputStream.socketWrite(Unknown Source)
 at java.net.SocketOutputStream.write(Unknown Source)
 at java.io.BufferedOutputStream.flushBuffer(Unknown Source)
 at java.io.BufferedOutputStream.flush(Unknown Source)
 at FileTransfer.send(FileTransfer.java:20)
 at MainServer.main(MainServer.java:12)

私を助けてください!

4

2 に答える 2

2

この例外は、クライアントが予期せずソケットを閉じたことを意味します。

available()while ループでのチェックにはおそらく使用したくないでしょう。この関数は、ファイル内の合計バイト数ではなく、ブロックせずに読み取ることができるバイト数のみを示します。代わりに、サーバーで次のようなものが必要です。

while (fileIn.read(b) != -1) { ...

クライアントでも同様のコードを使用する必要があります。

また、コードは 32 バイト未満の読み取りを処理しないことに注意してください。あなたは本当にすべきです:

while ((n = fileIn.read(b))!= -1) {
  out.write(b, n);
  ...

最後に、32 バイトは非常に小さいサイズです。4KB、8KB、またはそれ以上のバッファを使用すると、より高速な転送が得られる場合があります。

于 2012-11-03T22:45:05.760 に答える
1

車輪を再発明しないでください。IOUtils.copy(InputStream input, OutputStream output)Apache Commons IO ライブラリから使用します。

于 2012-11-03T22:51:19.707 に答える