1

これが私が今持っているものです。

レシーバー:

public static void read(Socket socket, ObjectInputStream in) {
    try {
        String separator = in.readUTF();
        while (in.readByte() == -3) {
            String path = in.readUTF().replaceAll(separator, System.getProperty("file.separator"));
            File file = new File(new File(path).getParent());
            if (!file.exists()) {
                file.mkdirs();
            }
            FileOutputStream fos = new FileOutputStream(path);
            int b = 0;
            while ((b = in.readByte()) != -4) {
                fos.write(b);
            }
            fos.close();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

送信者:

public static void send(String[] path) {
    Socket socket;
    try {
        socket = new Socket(ip, port);
        socket.setKeepAlive(true);
    } catch (UnknownHostException e) {
        return;
    } catch (IOException e) {
        return;
    }
    try {
        ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
        out.writeUTF(Devbox.getSeparator());
        for (String s : path) {
            send(s, out);
            out.writeByte(-2);
        }
        out.close();
        socket.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

private static void send(String path, ObjectOutputStream out) {
    File file = new File(path);
    if (file.isDirectory()) {
        File[] files = file.listFiles();
        for (File f : files) {
            send(path + f.getName(), out);
        }
    } else {
        try {
            out.writeByte(-3);
            out.writeUTF(path);
            FileInputStream fis = new FileInputStream(file);
            int b = 0;
            while ((b = fis.read()) != -1) {
                out.writeByte(b);
            }
            fis.close();
            out.writeByte(-4);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

これは、送信者に表示されるエラーです。

java.net.SocketException: Software caused connection abort: socket write error
    at java.net.SocketOutputStream.socketWrite0(Native Method)
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:109)
    at java.net.SocketOutputStream.write(SocketOutputStream.java:153)
    at java.io.ObjectOutputStream$BlockDataOutputStream.writeBlockHeader(ObjectOutputStream.java:1874)
    at java.io.ObjectOutputStream$BlockDataOutputStream.drain(ObjectOutputStream.java:1855)
    at java.io.ObjectOutputStream$BlockDataOutputStream.writeByte(ObjectOutputStream.java:1895)
    at java.io.ObjectOutputStream.writeByte(ObjectOutputStream.java:760)

を指す

                out.writeByte(b);

約 25 個のファイルを正常に送信すると、このエラーがスローされます。投げるファイルは毎回異なりますが、5ファイル程度で同じ範囲です。受信者は、通常、送信者が停止するファイルの前のカップルである特定のファイルの後に停止します。in.readByte() == -3 が false であるため、停止します。それが起こると、-85 や 16 のような数字が表示されました。別のコンピューターで試してみましたが、ソフトウェアについて何かが書かれていましたが、まったく同じでした。なぜこれが起こっているのか誰にも分かりますか?私はそれを理解しようとして一日を費やしましたが、どこにも行きませんでした。どんな助けでも大歓迎です。

4

2 に答える 2

0

send メソッドで BufferedInputStream を使用して FileInputStream を読み取ります。

BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
while ((b = bis.read()) != -1) {
    out.writeByte(b);
}

補完的な BufferedOutputStream も試してください

BufferedInputStream bos = new FileOutputStream(path);
int b = 0;
while ((b = in.readByte()) != -4) {
    bos.write(b);
}

さらに、ファイルの転送が終了したら、接続をフラッシュする必要があります。

out.flush;
于 2012-04-24T15:51:07.493 に答える
0

この回答を読んでください。それ以上のことは何も言えないと思います。また、コードには接続を閉じるものは何も表示されません。

OTNディスカッションより

WinSock の説明: このエラーは、ローカル ネットワーク システムが接続を中止したときに発生する可能性があります。これは、データの再送信が失敗した後に WinSock が確立された接続を中止した場合に発生します (受信者はデータストリーム ソケットで送信されたデータを確認しません)。

TCP/IP シナリオ: ローカル システムが送信されたデータの (ACK) 通知を受信しない場合、接続はタイムアウトになります。また、(FIN)ish TCP パケットが ACK されない場合もタイムアウトになります (FIN が ACK された場合でも、FIN が返されない場合は最終的にタイムアウトになります)。

これは WindowsXP でより多く発生するようで、Windows ファイアウォールの設定に関連している可能性もあります。いずれにせよ、顕著な点は、アボートがローカル マシン内で発生したことです。

于 2012-04-24T15:55:26.053 に答える