Вот что я имею прямо сейчас.Отправка файлов через поток
Приемник:
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? В противном случае приемник перестает записывать байты в выходной файл (и, возможно, даже закрывает соединение?), В то время как отправитель все еще записывает данные в поток. –
@AndreHolzner Да, я могу гарантировать, что это не проблема. – Stripies