繁体   English   中英

通过流发送文件

[英]Sending Files Through Stream

这就是我现在所拥有的。

接收方:

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之类的数字。我在另一台计算机上进行了尝试,因为它说明了一些有关软件的信息,并且完全相同。 有人知道为什么会这样吗? 我花了一天时间试图弄清楚,却一无所获。 任何帮助是极大的赞赏。

使用BufferedInputStream在send方法中读取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;

请阅读此答案 ,我认为除了此以外别无其他说法,也看不到您的代码中将关闭连接的任何内容。

来自OTN的讨论

WinSock描述:当本地网络系统中止连接时,可能会发生错误。 如果WinSock在数据重传失败后中止建立的连接(接收方从不确认在数据流套接字上发送的数据),则会发生这种情况。

TCP / IP方案:如果本地系统未收到发送数据的(ACK)提示,则连接将超时。 如果未确认(FIN)的TCP数据包也将超时(即使FIN已被ACK,如果未返回FIN,它最终也会超时)。

WindowsXP似乎更多地发生了这种情况,这似乎也可能与Windows防火墙设置有关。 在任何情况下,重点都在于中止源于本地计算机内部。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM