Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых
[Назад]

Библиотека примеров приложений Java

Оглавление
Простейший пример
Создание двух потоков
Управление потоками
Спрайтовая анимация
Панели с двигающимся текстом
Бегущая строка с мерцанием
Устранение мерцания
Поток для записи в файл
Контроль за выводом в файл
Чтение с сервера Web

Назад

6.10. Чтение с сервера Web в отдельном потоке

Пример аплета демонстрирует использование многопоточности при чтении файлов из каталогов сервера Web.

Исходный текст примера

Архив проекта для Java WorkShop 2.0

Демонстрация
(ваш браузер должен уметь работать с аплетами Java JDK 1.1)

Немного теории

Как известно, данные передаются через сеть Internet не слишком быстро, причем этот процесс может в любой момент времени приостановиться или совсем прекратиться. Поэтому для исключения блокирования работы приложения имеет смысл выполнять обмен данными по сети в отдельном потоке.

При этом для создания потоков можно использовать обычные методы, описанные нами ранее в предыдущих разделах библиотеки примеров.

Описание примера

В окне нашего аплета расположено однострочное поле редактирования адреса URL, кнопка с надписью Get and Show, и многострочное поле редактирования, занимающее всю основное пространство в окне аплета (рис. 1).

pic1.gif (8498 bytes)

Рис. 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 создается поток ввода данных.

Чтение из потока выполняется в цикле, условием завершения которого является полное исчерпание потока ввода. Прочитанные данные добавляются к содержимому многострочного поля редактирования.


Назад

[Назад]