-
10.2.4.3 Пример 3: Разработка протоколов уровня сетевых приложений
Издательство Университета Цинхуа «Java-программисты, чем заняться на работе» автор: Чжун Шэн - Частичные выдержки из главы 10 «Мастер настолько талантлив, насколько он способен».
Каждый, возможно, использовал инструменты загрузки и выгрузки по FTP. Например, «LeapFTP» — это очень удобный инструмент для загрузки и скачивания с FTP-сервера, как показано на рисунке. Этот инструмент очень удобен. После ввода имени пользователя и пароля вы можете увидеть список файлов на FTP-сервере, что облегчает операции загрузки и скачивания.
Вы когда-нибудь пытались написать приложение для загрузки и скачивания файлов по FTP на Java?
Java также может разработать такую программу. Это несложно. Давайте сначала посмотрим, как разработать FTP-приложение с использованием набора инструментов FTP. См. следующую программу.
импортировать sun.net.*;
импортировать sun.net.ftp.*;
публичный класс FTP {
public static void main(String[] args) {
String server="192.168.0.12" //Введите IP-адрес FTP-сервера.
String user="useway"; //Имя пользователя для входа на FTP-сервер
String пароль=" !@#$%abce " //Пароль имени пользователя для входа на FTP-сервер
String path="/home/useway" //Путь на FTP-сервере;
пытаться {
FtpClient ftpClient=new FtpClient(); //Создаем объект FtpClient
ftpClient.openServer(server); //Подключаемся к FTP-серверу
ftpClient.login(пользователь, пароль); //Войдите на FTP-сервер;
если (path.length()!=0) ftpClient.cd(путь);
TelnetInputStream is=ftpClient.list();
интервал с;
while ((c=is.read())!=-1) {
System.out.print((char)c);
}
есть.закрыть();
ftpClient.closeServer();//Выходим с FTP-сервера
}
catch(Исключение ex){
}
}
}
Если вам интересно, вы можете написать эту программу самостоятельно. При запуске этой программы мы увидим ситуацию, показанную на рисунке, со списком содержимого каталога серверной программы.
Эта программа представляет собой простую программу для получения списка файлов на FTP-сервере, но не поймите меня неправильно, эту программу нельзя назвать разработкой программы «Протокол уровня сетевых приложений»!
Эта программа использует только соответствующие классы «sun.net.*;» и «sun.net.ftp.*;» для работы на стороне FTP. Мы не используем Java-сокет на сетевом уровне для доступа к FTP-серверу. запрос отправляется клиенту, но запрос ссылки отправляется на сервер через набор инструментов, предоставляемый Java.
Преимущество использования FTP-пакета Java для подключения к FTP-серверу заключается в том, что нам не нужно заботиться о конкретных деталях отправки данных на сетевом уровне, а нужно только вызвать соответствующий метод. Недостаток использования FTP-пакета Java для подключения к FTP-серверу заключается в том, что разработчики не знают всех тонкостей отправки и получения протокола прикладного уровня, не могут понять принципы и очень слабо понимают основные данные.
В этот момент некоторые программисты спросят: «Так как же FTP взаимодействует между ПК и сервером на сетевом уровне?» Что ж, позвольте мне перечислить вам процесс взаимодействия протокола FTP.
Пожалуйста, посмотрите на следующий пример взаимодействия протокола FTP:
FTP-серверы: 220 (vsFTPd 2.0.1)
FTP-клиент: способ использования USER
FTP-сервер: 331 Пожалуйста, укажите пароль.
FTP-клиент: PASS !@#$%abce
FTP-сервер: 230 Вход успешен.
FTP-клиент: CWD /home/useway
FTP-сервер: 250 Каталог успешно изменен.
FTP-клиент: EPSV ALL
FTP-сервер: 200 EPSV ВСЕ ок.
FTP-клиент: EPSV
FTP-сервер: 229 Вход в расширенный пассивный режим (|||62501|)
FTP-клиент: СПИСОК
FTP-сервер: 150 Вот список каталогов.
FTP-сервер: 226 Отправка каталога ОК.
FTP-клиент: ВЫХОД
FTP-сервер: 221 До свидания.
Приведенный выше текст на самом деле представляет собой процесс взаимодействия FTP-сервера и FTP-клиента. Протоколом передачи информации между ними является протокол TCP, а передаваемый друг другу контент — это то, что написано в приведенном выше тексте.
Поясним смысл каждого предложения поэтапно:
FTP-сервер: 220 (vsFTPd 2.0.1) Описание: ссылка установлена успешно.
FTP-клиент: способ использования USER | Инструкции: введите имя пользователя.
FTP-сервер: 331 Пожалуйста, укажите пароль |Описание: Пожалуйста, введите пароль.
FTP-клиент: PASS !@#$%abce |Инструкции: введите пароль
FTP-сервер: 230 Вход выполнен успешно. Описание: Вход выполнен успешно.
FTP-клиент: CWD /home/useway Описание: Переключение каталога.
FTP-сервер: 250 Каталог успешно изменен |Описание: Переключение каталога выполнено успешно.
FTP-клиент: EPSV ALL | Описание: режим пассивного соединения EPSV.
FTP-сервер: 200 EPSV ВСЕ ок. Описание: ОК.
FTP-клиент: EPSV Описание: Ссылка
FTP-сервер: 229 Вход в расширенный пассивный режим (|||62501|) |Описание: порт пассивного канала — 62501.
FTP-клиент: LIST | Описание: Выполните LIST, чтобы отобразить список файлов.
FTP-сервер: 150 Вот список каталогов | Описание: Список отправляется с порта 62501.
FTP-сервер: 226 Отправка каталога ОК |Описание: Отправка завершена.
FTP-клиент: ВЫХОД Описание: Выход из FTP
FTP-сервер: 221 До свидания Описание: До свидания.
Используя содержимое приведенного выше текста, мы можем получить список файлов FTP без каких-либо инструментов. Если вы не верите, следуйте за мной и сделайте это снова.
Шаг 1. Сначала откройте CMD, чтобы войти в режим командной строки DOS, и введите:
телнет 192.168.0.1 21[Ввести]
Описание: Telnet к порту 21 FTP-сервера.
После выполнения этой команды получены такие результаты, как показано на рисунке.
Вы обнаружили какие-либо проблемы?
Содержимое приглашения соответствует первому предложению предыдущего абзаца: 220 (vsFTPd 2.0.1), что означает, что FTP-сервер принял нашу ссылку и может перейти к следующему шагу.
Шаг 2: Введите следующую серию отправляемого содержимого одну за другой:
ПОЛЬЗОВАТЕЛЬ[Enter]
ПРОЙДИТЕ !@#$%abce [Ввести]
CWD /home/useway[Ввести]
EPSV ВСЕ[Ввести]
ЭПСВ[Ввести]
Полученные результаты показаны на рисунке.
Что ж, на этот раз FTP-сервер дал серию ответов и, наконец, выдал новый номер порта «58143».
Шаг 3. Откройте новое окно CMD и введите:
телнет 192.168.0.1 58143[Ввести]
Обратите внимание, что номер порта запроса Telnet на подключение к серверу на этот раз — «58143», это порт связи, предоставленный нам FTP-сервером. После привязки окно пустое без каких-либо подсказок, как показано на рисунке.
Шаг 4. Вернитесь в первое окно CMD и введите:
СПИСОК[Ввести]
Шаг 5: В это время второе окно CMD получает список файлов:
Во втором окне появляется список файлов, как показано на рисунке.
Шаг 6: Выйдите из операции
ВЫХОД[Ввести]
После завершения выполнения ссылка на хост теряется, как показано на рисунке.
Как видите, протокол FTP представляет собой интерактивный процесс. Вы также можете выполнить эти основные командные операции FTP с помощью инструмента Telnet, который поставляется с системой. Если вы хотите использовать Java Socket для выполнения вышеуказанной операции, вам нужно только шаг за шагом следовать приведенному выше содержимому, чтобы отправить строку на FTP-сервер.
Ниже мы также приводим пример кода:
импортировать java.io.InputStream;
импортировать java.io.OutputStream;
импортировать java.net.Socket;
общественный класс FTPClient {
public static void main(String[] args) выдает исключение {
Сокет сокет = новый сокет("192.168.0.1",21);
InputStream = Socket.getInputStream();
OutputStream os = socket.getOutputStream();
//Получаем исходную информацию о ссылке
буфер байт[] = новый байт[100];
длина int = is.read(буфер);
String s = новая строка (буфер, 0, длина);
System.out.println(s);
//Отправляем имя пользователя
String str = "ПОЛЬЗОВАТЕЛЬn";
os.write(str.getBytes());
//Получаем возвращаемое значение
длина = is.read(буфер);
s = новая строка (буфер, 0, длина);
System.out.println(s);
//Отправить пароль
str = "PASS !@#$%abcdn ";
os.write(str.getBytes());
//Получаем возвращаемое значение
длина = is.read(буфер);
s = новая строка (буфер, 0, длина);
System.out.println(s);
//Отправляем команду переключения папки
str = "CWD /home/usewayn";
os.write(str.getBytes());
//Получаем возвращаемое значение
длина = is.read(буфер);
s = новая строка (буфер, 0, длина);
System.out.println(s);
//Установим режим
str = "EPSV ВСЕn";
os.write(str.getBytes());
//Получаем возвращаемое значение
длина = is.read(буфер);
s = новая строка (буфер, 0, длина);
System.out.println(s);
//Получаем информацию пассивного мониторинга
стр = "EPSVn";
os.write(str.getBytes());
//Получаем возвращаемое значение
длина = is.read(буфер);
s = новая строка (буфер, 0, длина);
System.out.println(s);
//Получаем номер порта для пассивного мониторинга FTP
String portlist=s.substring(s.indexOf("(|||")+4,s.indexOf("|)"));
System.out.println(список портов);
//Создаем экземпляр класса потока ShowList и связываем номер порта пассивного прослушивания FTP
ShowList sl=новый ShowList();
sl.port=Integer.parseInt(список портов);
сл.старт();
//Выполняем команду СПИСОК
str = "СПИСОКn";
os.write(str.getBytes());
//Получаем возвращаемое значение
длина = is.read(буфер);
s = новая строка (буфер, 0, длина);
System.out.println(s);
//Закрываем ссылку
есть.закрыть();
ОС.закрыть();
сокет.закрыть();
}
}
//Получаем класс информации о пассивной ссылке, этот класс многопоточный
класс ShowList расширяет Thread{
общедоступный внутренний порт = 0;
общественный недействительный запуск () {
пытаться{
Сокет сокет = новый сокет("192.168.0.1",this.port);
InputStream = Socket.getInputStream();
OutputStream os = socket.getOutputStream();
буфер байт[] = новый байт[10000];
длина int = is.read(буфер);
String s = новая строка (буфер, 0, длина);
System.out.println(s);
//Закрываем ссылку
есть.закрыть();
ОС.закрыть();
сокет.закрыть();
}
catch(Исключение ex){
}
}
}
Результат работы, полученный после запуска программы, показан на рисунке. По сути, он аналогичен приведенному выше эффекту запуска. А что насчет нижнего уровня? Насколько мы понимаем, это не что иное, как распаковка инкапсулированных методов. правила их работы мы можем. Такую же программу можно разработать.