Назад
6.10. Чтение с сервера Web в отдельном потоке
Пример аплета демонстрирует использование
многопоточности при чтении файлов из каталогов
сервера Web.
Исходный текст примера
Архив проекта для Java WorkShop 2.0
Демонстрация
(ваш браузер должен уметь работать с аплетами
Java JDK 1.1)
Немного теории
Как известно, данные передаются через сеть Internet
не слишком быстро, причем этот процесс может в
любой момент времени приостановиться или совсем
прекратиться. Поэтому для исключения
блокирования работы приложения имеет смысл
выполнять обмен данными по сети в отдельном
потоке.
При этом для создания потоков можно
использовать обычные методы, описанные нами
ранее в предыдущих разделах библиотеки примеров.
Описание примера
В окне нашего аплета расположено однострочное
поле редактирования адреса URL, кнопка с надписью
Get and Show, и многострочное поле редактирования,
занимающее всю основное пространство в окне
аплета (рис. 1).
Рис. 1. Окно аплета, способного получать c
сервера Web и отображать содержимое текстовых
файлов
Обращаем ваше внимание на то, что данный аплет
может получить файлы только с того сервера Web, с
которого он был загружен.
Перейдем к описанию исходного текста аплета.
Главный класс аплета
Главный класс создан на базе класса Applet и
реализует интерфейсы ActionListener и Runnable:
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
public class ShowWebFile extends Applet
implements ActionListener, Runnable
{
. . .
}
Интерфейс ActionListener нужен для обработки события
от кнопки, а интерфейс Runnable - для создания потока,
в рамках которого будет орагнизовано получение
файла с сервера Web.
В главном классе мы определили три поля:
TextField urlAddress;
TextArea txt;
Button btnGet;
Первое из них является ссылкой на поле ввода
адреса URL, второе - ссылкой на многострочное поле
редактирования, а третье - ссылкой на кнопку.
Метод init
При инициализации мы сначала создаем все
необходимые компоненты:
urlAddress = new TextField("http://", 50);
txt = new TextArea("", 20, 70);
btnGet = new Button("Get and show");
Далее мы устанавливаем режим размещения
компонент GridBagLayout:
GridBagLayout gbl = new GridBagLayout();
GridBagConstraints c =
new GridBagConstraints();
setLayout(gbl);
На следующем этапе метод init устанавливает для
компонент параметры размещения и добавляет
компоненты в окно аплета:
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 1.0;
gbl.setConstraints(urlAddress, c);
add(urlAddress);
c.fill = GridBagConstraints.NONE;
c.gridwidth = GridBagConstraints.REMAINDER;
c.weightx = 0.0;
gbl.setConstraints(btnGet, c);
add(btnGet);
c.fill = GridBagConstraints.BOTH;
c.weighty = 1.0;
gbl.setConstraints(txt, c);
add(txt);
Последнее, что делает метод init, это регистрация
обработчика событий от кнопки:
btnGet.addActionListener(this);
Метод actionPerformed
Когда пользователь нажимает кнопку,
расположенную в окне аплета, управление
передается методу actionPerformed:
public void actionPerformed(ActionEvent e)
{
if(e.getSource().equals(btnGet))
{
Thread getThread = new Thread(this);
getThread.start();
}
}
Данный метод просто создает поток getThread и
запускает его на выполнение.
Метод run
Метод run работает в отдельном потоке и потому не
блокирует работу приложения.
Вот что он делает:
String str;
byte buf[] = new byte[100];
URL u;
try
{
u = new URL(urlAddress.getText());
InputStream is = u.openStream();
while(true)
{
int nReaded = is.read(buf);
if(nReaded == -1)
break;
str = new String(buf);
txt.append(str.substring(0, nReaded));
}
}
catch(Exception ioe)
{
showStatus(ioe.toString());
stop();
}
Прежде всего метод создает новый объект класса
URL, соответствующей строке адреса, введенной
пользователем.
Далее для этого адреса при помощи метода openStream
создается поток ввода данных.
Чтение из потока выполняется в цикле, условием
завершения которого является полное исчерпание
потока ввода. Прочитанные данные добавляются к
содержимому многострочного поля редактирования.
Назад |