Пример в этой статье описывает метод копирования файлов между двумя серверами в Java. Поделитесь этим со всеми для справки. Конкретный анализ заключается в следующем:
Обычно функция копирования файлов, которую мы используем чаще всего, — это функция копирования файлов между одними и теми же серверами. Здесь представлено функциональное обновление обычного копирования файлов, которое может реализовать копирование файлов между двумя серверами.
1. Серверная часть
Скопируйте код следующим образом: package sterning;
импортировать java.io.BufferedInputStream;
импортировать java.io.DataInputStream;
импортировать java.io.DataOutputStream;
импортировать java.io.File;
импортировать java.io.FileInputStream;
импортировать java.net.ServerSocket;
импортировать java.net.Socket;
общественный класс ServerTest {
внутренний порт = 8821;
недействительный старт () {
Сокет s = ноль;
пытаться {
ServerSocket ss = новый ServerSocket (порт);
в то время как (истина) {
//Выбираем файлы для переноса
Строка filePath = "D://lib.rar";
Файл fi = новый файл (filePath);
System.out.println("Длина файла:" + (int) fi.length());
// публичный сокет Accept() выдает
// IOException прослушивает и принимает соединения с этим сокетом. Этот метод блокируется до тех пор, пока не будет установлено соединение.
с = сс.принять();
System.out.println("Установить соединение с сокетом");
DataInputStream dis = новый DataInputStream (новый BufferedInputStream (s.getInputStream ()));
dis.readByte();
DataInputStream fis = новый DataInputStream (новый BufferedInputStream (новый FileInputStream (filePath)));
DataOutputStream ps = новый DataOutputStream(s.getOutputStream());
//Передаем имя и длину файла клиенту. Чтобы быть по-настоящему применимым ко всем платформам, обработка китайских имен, например, все еще требует обработки. Подробности см. в готовом коде в Think In Java 4th.
ps.writeUTF(fi.getName());
пс.флеш();
ps.writeLong((long) fi.length());
пс.флеш();
intufferSize = 8192;
байт[] buf = новый байт[bufferSize];
в то время как (истина) {
интервал чтения = 0;
если (фис != ноль) {
читать = fis.read(buf);
}
если (читай == -1) {
перерыв;
}
ps.write(buf, 0, чтение);
}
пс.флеш();
// Будьте осторожны, закрывая ссылку на сокет, иначе клиент будет ждать данных от сервера.
// Пока не истечет время ожидания сокета, что приведет к неполным данным.
фис.закрыть();
с.закрыть();
System.out.println("Передача файла завершена");
}
} catch (Исключение е) {
е.printStackTrace();
}
}
public static void main(String arg[]) {
новый ServerTest().start();
}
}
2. Использование вспомогательного класса сокета
Скопируйте код следующим образом: package sterning;
импортировать java.net.*;
импортировать java.io.*;
общественный класс ClientSocket {
частный строковый IP-адрес;
частный международный порт;
частный сокет сокета = ноль;
DataOutputStream out = null;
DataInputStream getMessageStream = null;
public ClientSocket (String ip, int port) {
this.ip = ip;
this.port = порт;
}
/** *//**
* Создать сокетное соединение
*
* @throwsException
* исключение
*/
public void CreateConnection() выдает исключение {
пытаться {
сокет = новый сокет (IP, порт);
} catch (Исключение е) {
е.printStackTrace();
если (сокет != ноль)
сокет.закрыть();
бросить е;
} окончательно {
}
}
public void sendMessage(String sendMessage) выдает исключение {
пытаться {
out = новый DataOutputStream(socket.getOutputStream());
если (sendMessage.equals("Windows")) {
out.writeByte(0x1);
out.flush();
возвращаться;
}
если (sendMessage.equals("Unix")) {
out.writeByte(0x2);
out.flush();
возвращаться;
}
если (sendMessage.equals("Linux")) {
out.writeByte(0x3);
out.flush();
} еще {
out.writeUTF(sendMessage);
out.flush();
}
} catch (Исключение е) {
е.printStackTrace();
если (выход != ноль)
выход.закрыть();
бросить е;
} окончательно {
}
}
public DataInputStream getMessageStream() выдает исключение {
пытаться {
getMessageStream = новый DataInputStream (новый BufferedInputStream (socket.getInputStream ()));
вернуть getMessageStream;
} catch (Исключение е) {
е.printStackTrace();
если (getMessageStream! = ноль)
getMessageStream.close();
бросить е;
} окончательно {
}
}
общественный недействительный ShutDownConnection () {
пытаться {
если (выход != ноль)
выход.закрыть();
если (getMessageStream! = ноль)
getMessageStream.close();
если (сокет != ноль)
сокет.закрыть();
} catch (Исключение е) {
}
}
}
3.Клиент
Скопируйте код следующим образом: package sterning;
импортировать java.io.BufferedOutputStream;
импортировать java.io.DataInputStream;
импортировать java.io.DataOutputStream;
импортировать java.io.FileOutputStream;
общественный класс ClientTest {
частный ClientSocket cs = null;
Private String ip = "localhost";//Установить IP-адрес сервера Private Int Port = 8821;
частная строка sendMessage = "Windwos";
общественный ClientTest() {
пытаться {
если (createConnection()) {
отправитьСообщение();
ПолучитьСообщение();
}
} catch (исключение ex) {
ex.printStackTrace();
}
}
частное логическое значение createConnection() {
cs = новый ClientSocket (IP, порт);
пытаться {
cs.CreateConnection();
System.out.print("Соединение с сервером успешно!" + "/n");
вернуть истину;
} catch (Исключение е) {
System.out.print("Не удалось подключиться к серверу!" + "/n");
вернуть ложь;
}
}
частный недействительный sendMessage () {
если (cs == ноль)
возвращаться;
пытаться {
cs.sendMessage(sendMessage);
} catch (Исключение е) {
System.out.print("Не удалось отправить сообщение!" + "/n");
}
}
частный недействительный getMessage() {
если (cs == ноль)
возвращаться;
DataInputStream inputStream = null;
пытаться {
inputStream = cs.getMessageStream();
} catch (Исключение е) {
System.out.print("Ошибка кэша получения сообщений/n");
возвращаться;
}
пытаться {
//Локальный путь сохранения, имя файла будет автоматически унаследовано от сервера.
Строка savePath = "E://";
intufferSize = 8192;
байт[] buf = новый байт[bufferSize];
интервал паслен = 0;
Лонглен = 0;
savePath += inputStream.readUTF();
DataOutputStream fileOut = новый DataOutputStream (новый BufferedOutputStream (новый BufferedOutputStream (новый FileOutputStream (savePath))));
лен = inputStream.readLong();
System.out.println("Длина файла:" + len + "/n");
System.out.println("Начать получать файлы!" + "/n");
в то время как (истина) {
интервал чтения = 0;
если (inputStream!= ноль) {
чтение = inputStream.read(buf);
}
паслен += прочитано;
если (читай == -1) {
перерыв;
}
//Индикатор выполнения, показанный ниже, изначально создан для панели прогресса графического интерфейса. Если вы печатаете здесь файл, некоторые из одних и тех же процентов могут печататься повторно.
System.out.println("Файл получен" + (passedlen * 100/len) + "%/n");
fileOut.write(buf, 0, чтение);
}
System.out.println("Прием завершен, файл сохранен как" + savePath + "/n");
файлВыход.закрыть();
} catch (Исключение е) {
System.out.println("Ошибка при получении сообщения" + "/n");
возвращаться;
}
}
public static void main(String arg[]) {
новый ClientTest();
}
}
Я надеюсь, что эта статья будет полезна каждому, кто занимается программированием на Java.