Здравствуйте и благодарите заранее за то, что нашли время для чтения. Я пытаюсь разработать простую программу передачи файлов Java с использованием TCP. До сих пор с использованием моих клиентских и серверных классов мне удалось добавить к нему рабочий метод загрузки (загрузить файл на компьютер, на котором работает сервер).Приложение для передачи файлов Java TCP
Я довольно неопытен с этим, поэтому я иду довольно медленно. Мне также нужно добавить параметр загрузки (получить файл с сервера), перечислить все файлы с сервера, а также параметр, который позволяет мне удалять любой файл с сервера.
Для сервера и клиента я использую специальную папку по умолчанию (C:/Sharedfolder в этом случае). В настоящее время я задаю следующие вопросы:
- В моем текущем коде сервера файлы, которые загружаются к нему, переименовываются в «новый файл». Как я могу заставить это изменить имя файла на что-то вроде «oldfile_new» (будучи oldfile именем фактического исходного файла)?
- Используя мой текущий код сервера ниже, могу ли я создать клиентский класс для загрузки файла с сервера, который будет работать с ним? И как мне это сделать? Часть загрузки для меня имела смысл, но я все еще пытаюсь выяснить файлы для загрузки/записи с сервера.
- В настоящее время я использую предопределенный IP-адрес хоста, но в конечном итоге мне нужно будет изменить приложение, чтобы клиент отправил широковещательную рассылку UDP, чтобы найти сервер в частной сети. Может ли кто-нибудь указать мне в любом направлении, как это сделать?
Мой текущий код сервера выглядит следующим образом:
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(4555);
} catch (IOException ex) {
System.out.println("Can't setup server on this port number.\n");
}
Socket socket = null;
InputStream is = null;
OutputStream fos = null;
BufferedOutputStream bos = null;
int bufferSize = 0;
System.out.println("Ready...");
try {
socket = serverSocket.accept();
} catch (IOException ex) {
System.out.println("Can't accept client connection.\n");
}
try {
is = socket.getInputStream();
bufferSize = socket.getReceiveBufferSize();
System.out.println("Buffer size: " + bufferSize);
} catch (IOException ex) {
System.out.println("Can't get socket input stream.\n");
}
try {
fos = new FileOutputStream("C:\\Sharedfolder\\newfile");
bos = new BufferedOutputStream(fos);
} catch (FileNotFoundException ex) {
System.out.println("File not found.\n");
}
byte[] bytes = new byte[bufferSize];
int count;
while ((count = is.read(bytes)) > 0) {
bos.write(bytes, 0, count);
}
bos.flush();
bos.close();
is.close();
socket.close();
serverSocket.close();
}
}
Любая помощь будет оценена. Спасибо :)
Вам не нужно BufferedInput/OutputStream, если вы уже читаете/пишите большой байт []. Загрузка - это то же самое, что и загрузка, единственная разница заключается в том, какой конец отправляется и какой конец получает. Код в основном тот же. –
Спасибо за ответ. Будет ли часть загрузки требовать от меня добавить что-то в класс сервера? Или изменения будут сделаны только на стороне клиента? Меня смущает сервер, работающий на фоне. – Jaqualembo
Единственное различие между клиентом и сервером заключается в том, кто создал соединение, после чего у вас есть Socket, который выглядит одинаково с обоих концов. Я предлагаю вам извлечь код для отправки файла и другой способ получения файла. Разница в том, что сервер будет отправлять вместо клиента и клиент будет получать вместо отправки. Тот факт, что процесс работает в фоновом режиме, не должен иметь никакого значения. Клиент тоже может быть в фоновом режиме. –