Тег <applet> используется для запуска апплета как из HTML-документа, так и из программы appletviewer. Программа appletviewer выполняет каждый найденный ей тег <applet> в отдельном окне, в то время как браузеры позволяют разместить на одной странице несколько апплетов. Синтаксис тэга <APPLET> в настоящее время таков : <APPLET>
CODE = appletFile OBJECT = appletSerialFile WIDTH = pixels HEIGHT = pixels [ARCHIVE = jarFiles] [CODEBASE = codebaseURL] [ALT = alternateText] [NAME = appletInstanceName] [ALIGN = alignment] [VSPACE = pixels] [HSPACE = pixels] > [< PARAM NAME = AttributeNamel VALUE = AttributeValuel >] [< PARAM NAME = AttributeName2 VALUE = AttributeValue2 >] [HTML-текст, отображаемый при отсутствии поддержки Java] </APPLET>
getParameter(String)
Метод getParameter возвращает значение типа String, соответствующее указанному имени параметра. Если вам в качестве параметра требуется значение какого-либо другого типа, вы должны преобразовать строку-параметр самостоятельно. Вы сейчас увидите некоторые примеры использования метода getParameter для извлечения параметров из приведенного ниже примера: <applet code=Testing width=40 height=40> <param name=fontName value=Univers> <param name=fontSize value=14> <param name=leading value=2> <param name=accountEnabled value=true> Ниже показано, как извлекается каждый из этих параметров: String FontName = getParameter("fontName"); String FontSize = Integer.parseInt(getParameter("fontSize")); String Leading = Float.valueOf(getParameter("leading")); String PaidUp = Boolean.valueOf(getParameter("accountEnabled")); Контекст апплета getDocumentBase и getCodeBase
Возможно, Вы будете писать апплеты, которым понадобится явно загружать данные и текст. Java позволяет апплету загружать данные из каталога, в котором располагается HTML-документ, запустивший апплет (база документа - getDocumentBase), и из каталога, из которого был загружен class-файл с кодом апплета (база кода - getCodeBase).
Интерфейс AppletContextДоступ к этому интерфейсу из апплета предоставляется методом getAppletContext. С его помощью апплет может взаимодействовать со страницей, откуда он был загружен, и с браузером. Так, именно в этом интерфейсе определен метод getApplet, с помощью которого можно обратиться по имени к другому апплету, находящемуся на той же странице.Метод showStatus меняет текст поля статуса в окне браузера.Метод showDocument позволяет загрузить новую страницу в браузер.
84.
Пример рисования апплетов
//подключаем библиотеки import java.applet.*; import java.awt.*; //объявляем новый класс public class Body extends Applet{ public void paint(Graphics g) { int yDraw; //Очищаем область. g.clearRect(0, 0, 100,100); //Выбираем цвет. g.setColor(Color.yellow); // Рисуем закрашенный прямоугольник. g.fillRect(0, 0, 100, 100); //Выбираем цвет. g.setColor(Color.black); //Рисуем прямоугольник. g.drawRect(0, 0, 10,10); //Рисуем прямую линию. g.drawLine(0,0,100,100) ; } }
89.
Пример клиент-серверной программы.Машина, которая стоит в одном месте, называется сервером, а машина, которая ищет, называется клиентом. Это различие важно лишь до тех пор, пока клиент пробует соединится с сервером. Как только они соединятся, они становятся двумя сторонами коммуникационного процесса и более не имеет значения, какая машина принимала роль сервера, а какая принимала роль клиента.Таким образом, работа сервера состоит в прослушивании соединения, она выполняется с помощью специального объекта, который вы создаете. Этот пример покажет простейшее использование серверного и клиентского сокета. Все, что делает сервер, это ожидает соединения, затем использует сокет, полученный при соединении, для создания InputStream'а и OutputStream'а. Они конвертируются в Reader и Writer, которые оборачиваются в BufferedReader и PrintWriter. После этого все, что будет прочитано из BufferedReader'а будет переправлено в PrintWriter, пока не будет получена строка "END", означающая, что пришло время закрыть соединение.Клиент создает соединение с сервером, затем создает OutputStream и создает некоторую обертку, как и в сервере. Строки текста посылаются через полученный PrintWriter. Клиент также создает InputStream (опять таки, с соответствующей конвертацией и оберткой), чтобы слушать, что говорит сервер .Вот сервер:
//: c15:JabberServer.java // Очень простой сервер, который просто отсылает // назад все, что посылает клиент. // {RunByHand} import java.io.*;
import java.net.*; publicclass JabberServer { // Выбираем порт вне пределов 1-1024: publicstaticfinal int PORT = 8080; publicstatic void main(String[] args) throws IOException { ServerSocket s = new ServerSocket(PORT); System.out.println("Started: " + s); try { // Блокирует до тех пор, пока не возникнет соединение: Socketsocket = s.accept(); try { System.out.println("Connectionaccepted: " + socket); BufferedReaderin = new BufferedReader(new InputStreamReader( socket.getInputStream()));
// Вывод автоматически выталкивается из буфера PrintWriter'ом PrintWriterout = new PrintWriter(new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())), true); while (true) { Stringstr = in.readLine(); if (str.equals("END")) break; System.out.println("Echoing: " + str); out.println(str); } // Всегда закрываем два сокета... } finally { System.out.println("closing..."); socket.close(); } } finally { s.close(); } } } // /:~
BufferedReader in = new BufferedReader(new InputStreamReader(socket .getInputStream())); // Выводавтоматически Output быталкиваетсяPrintWriter'ом. PrintWriter out = new PrintWriter(new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())), true); for (int i = 0; i< 10; i++) { out.println("howdy " + i); String str = in.readLine(); System.out.println(str); } out.println("END"); } finally { System.out.println("closing..."); socket.close(); } } } // /:~
90.
Создание клиент-серверной программы с помощью дейтаграмм.Необходимые средства поддержки протокола UDP находятся в пакете java.net. Для создания дейтаграмм в Java существует классDatagramPacket. При получении дейтаграммы по протоколу UDP класс DatagramPacket используется также для чтения данных, адреса отправителя и метаинформации. Чтобы создать дейтаграмму для отправки на удаленную машину, используется следующий конструктор:publicDatagramPacket(byte[] ibuf, int length, InetAddressiaddr, intiport);Здесь ibuf − массив байт, содержащий кодированное сообщение; length − количество байт, которое должно быть помещено в пакет, что определяет размер дейтаграммы; iaddr − это экземпляр класса InetAddress, который хранит IP-адрес получателя; iport указывает номер порта, на который посылается дейтаграмма. Чтобы получить дейтаграмму, необходимо использовать другой конструктор для объекта DatagramPacket, в котором будут находиться принятые данные. Прототип конструктора имеет вид:publicDatagramPacket(byte[] ibuf, intlength);Дейтаграммы не ограничены определенной длиной; можно создавать как очень длинные, так и очень короткие дейтаграммы. Заметим, однако, что между клиентом и сервером должно существовать соглашение о длине дейтаграмм, поскольку они оба должны создать массив байт нужного размера перед созданием объекта DatagramPacket для посылки или получения дейтаграммы.Когда дейтаграмма получена, как будет продемонстрировано ниже, можно прочитать ее данные. Другие методы позволяют получить метаинформацию, относящуюся к сообщению:
publicintgetLength(); – возвращает количество байт, из которых состоят данные дейтаграммы;
publicbyte[] getData(); – позволяет получить массив, содержащий эти данные;
publicInetAddressgetAddress(); – возвращает адрес отправителя;
publicintgetPort(); – возвращает номер порта UDP, используемый отправителем.
Отправка и получение дейтаграмм осуществляется при помощи класса DatagramSocket, который создает сокет UDP. У него есть два конструктора, один из которых позволяет системе назначить любой из свободных портов UDP. Другой дает возможность задать конкретный порт, что полезно при разработке сервера. Как и для портов ТСР, в большинстве операционных систем порты с номерами меньше 1024 доступны только процессам с привилегиями суперпользователя.Рассмотрим пример, реализующий приложение клиент/сервер с использованием UDP сокетов. Листинг приложения сервера:
import java.net.*; import java.io.*; publicclassUDPServer { publicfinalstaticint DEFAULT_PORT = 8001;//определение порта //сервера publicfinalString VERSION_CMD = "VERS";//определение версии //команды publicfinalString QUIT_CMD = "QUIT";//определение //команды «выход» publicfinalbyte[] VERSION = { 'V', '2', '.', '0' };//создание массива //для определения версии сервера publicfinalbyte[] UNKNOWN_CMD = { 'U', 'n', 'k', 'n', 'o', 'w', 'n', ' ', 'c', 'o', 'm', 'm', 'a', 'n', 'd' };//неизвестная команда publicvoidrunServer() throwsIOException {//метод сервера runServer DatagramSocket s = null;//создание объекта DatagramSocket try { booleanstopFlag = false;//создание флага stopFlag и его инициализация //значением false byte[] buf = newbyte[512];//буфер для приема/передачи дейтаграммы s = newDatagramSocket(DEFAULT_PORT);//привязка сокета к //реальному объекту с портом DEFAULT_PORT System.out.println("UDPServer: Startedon " + s.getLocalAddress() + ":" + s.getLocalPort());//вывод к консоль сообщения while(!stopFlag) {//цикл до тех пор, пока флаг не примет значение true DatagramPacketrecvPacket = newDatagramPacket(buf, buf.length); //создание объекта дейтаграммы для получения данных s.receive(recvPacket);//помещение полученного содержимого в //объект дейтаграммы Stringcmd = newString(recvPacket.getData()).trim();//извлечение //команды из пакета System.out.println("UDPServer: Command: " + cmd); DatagramPacketsendPacket = newDatagramPacket(buf, 0, recvPacket.getAddress(), recvPacket.getPort()); //формирование объекта // дейтаграммы для отсылки данных int n = 0;//количество байт в ответе if (cmd.equals(VERSION_CMD)) {//проверка версии команды n = VERSION.length; System.arraycopy(VERSION, 0, buf, 0, n); } elseif (cmd.equals(QUIT_CMD)) { stopFlag = true;//остановка сервера continue; } else { n = UNKNOWN_CMD.length; System.arraycopy(UNKNOWN_CMD, 0, buf, 0, n); } sendPacket.setData(buf);//установить массив посылаемых данных sendPacket.setLength(n);//установить длину посылаемых данных s.send(sendPacket);//послать сами данные } // while(serverisnotstopped) System.out.println("UDPServer: Stopped"); } finally { if (s != null) { s.close();//закрытие сокета сервера } } } publicstaticvoidmain(String[] args) {//метод main try { UDPServerudpSvr = newUDPServer();//создание объекта udpSvr udpSvr.runServer();//вызов метода объекта runServer } catch(IOExceptionex) { ex.printStackTrace(); } } }
Листинг приложения клиента:
import java.net.*; import java.io.*; publicclassUDPClient {//описание класса клиента publicvoidrunClient() throwsIOException {//метод клиента runClient DatagramSocket s = null;//создание дейтаграммы try { byte[] buf = newbyte[512]; //буфер для приема/передачи дейтаграммы s = newDatagramSocket();//привязка сокета к реальному объету System.out.println("UDPClient: Started"); byte[] verCmd = { 'V', 'E', 'R', 'S' }; DatagramPacketsendPacket = newDatagramPacket(verCmd, verCmd.length, InetAddress.getByName("127.0.0.1"), 8001); //создание //дейтаграммы для отсылки данных s.send(sendPacket);//посылка дейтаграммы DatagramPacketrecvPacket = newDatagramPacket(buf, buf.length);//создание дейтаграммы для получения данных s.receive(recvPacket);//получение дейтаграммы Stringversion = newString(recvPacket.getData()).trim();//извлечение //данных (версии сервера) System.out.println("UDPClient: ServerVersion: " + version); byte[] quitCmd = { 'Q', 'U', 'I', 'T' }; sendPacket.setData(quitCmd);//установить массив посылаемых данных sendPacket.setLength(quitCmd.length);//установить длину посылаемых // данных s.send(sendPacket); //послать данные серверу System.out.println("UDPClient: Ended"); } finally { if (s != null) { s.close();//закрытие сокета клиента } } } publicstaticvoidmain(String[] args) {//метод main try { UDPClientclient = newUDPClient();//создание объекта client client.runClient();//вызов метода объекта client } catch(IOExceptionex) { ex.printStackTrace(); } } }
Вначале запустите сервер, затем клиент. В результате на сервере появятся строки: