Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ЕВ-4791

.pdf
Скачиваний:
26
Добавлен:
07.03.2016
Размер:
3 Мб
Скачать

public static void main (String [] args) throws IOExeption {

ServerSocket s = new ServerSocket(PORT); System.out.println(“Запущено:” + s);

try {

Socket socket = s.accept(); try {

System.out.println(“З’єднання підтверджене: + socket”);

BufferedReader in = new BufferedReader( new InputStreamReader ( socket.getInputStream()));

PrintWriter out =

new PrintWriter( new BufferedWriter( new OutputStreamWriter( socket.getOutputStream())), true);

while (true) {

String str = in.readLine();

if (str.equals(“END”)) break; System.out.println(“Відображення: ” + str); out.println(str);

}

} finally { System.out.println(“закриваємо…”); socket.close();

}

}finally { s.close();

}

}

}

Приклад 3. Простий клієнт, який надсилає рядки тексту і зчитує те, що надсилає йому у відповідь сервер:

import java.io.*; import java.net.*;

public class JabberClient {

public static void main (String [] args) throws IOExeption {

//

InetAddress addr = InetAddress.getByName(null); System.out.println(“addr = ” + addr);

Socket socket = new Socket(addr, JabberServer.PORT);

//

try {

System.out.println(“socket = ” + socket); BufferedReader in = new BufferedReader(

new InputStreamReader ( socket.getInputStream()));

//

PrintWriter out =

new PrintWriter( new BufferedWriter( new OutputStreamWriter( socket.getOutputStream())), true); for(int i=0; i<10; i++) { out.println(“вітаю ” + i);

141

String str = in.readLine(); System.out.println(str);

}

out.println(“END”); } finally {

System.out.println(“закриваємо…”); socket.close();

}

}

}

Приклад 4. Сервер, що використовує багатозадачність для обслуговування будь-якої кількості клієнтів:

import java.io.*; import java.net.*;

class ServeOneJabber extends Thread { private Socket socket;

private BuffereReader in; private PrintWriter out;

public ServeOneJabber (Socket s) throws IOExeption {

socket = s;

in = new BufferedReader(

new InputStreamReader ( socket.getInputStream()));

out =

new PrintWriter( new BufferedWriter( new OutputStreamWriter( socket.getOutputStream())), true);

start(); //

}

public void run() { try {

while (true) {

String str = in.readLine();

if (str.equals(“END”)) break; System.out.println(“Відображення: ” + str);

out.println(str);

}

System.out.println(“закриваємо…”); } catch (IOExeption e) {

System.err.println(“Помилка введення-виведення”); } finally {

try { socket.close();

} catch (IOExeption e) { System.err.println(“Роз’єм не вдалося закрити”);

}

}

}

}

public class MultiJabberServer { static final int PORT =8080;

public static void main (String [] args) throws IOExeption {

ServerSocket s = new ServerSocket(PORT);

142

System.out.println(“Сервер запущений:”); try {

while (true) {

socket socket = s.accept(); try {

new ServeOneJabber(socket); } catch (IOExeption e) { socket.close();

}

}

}finally { s.close();

}

}

}

Приклад 5. Програма тестування сервера і створення множини клієнтів. import java.io.*;

import java.net.*;

class JabberClientThread extends Thread { private Socket socket;

private BuffereReader in; private PrintWriter out; private int id = counter++;

private static int threadcount = 0; private static int threadCount() {

return threadcount;

}

public JabberClientThread(InetAddress addr){ System.out.println(“Створення клієнта” + id);

threadcount++; try {

socket = new Socket(addr, MultiJabberServer, PORT);

} catch (IOExeption e) {

System.err.println(“Помилка роз’єма Socket”);

}

try {

in = new BufferedReader(

new InputStreamReader ( socket.getInputStream()));

out =

new PrintWriter( new BufferedWriter( new OutputStreamWriter( socket.getOutputStream())), true);

start(); //

} catch (IOExeption e) { try { socket.close();

} catch (IOExeption e2) { System.err.println(“Роз’єм не був закритий”);

}

}

}

public void run() { try {

for (int i=0; i<25; i++) { out.println(“Клієнт ” + id +”: ” + i);

143

String str = in.readLine(); System.out.println( str);

}

out.println(“END”);

}catch (IOExeption e) {

System.err.println(“Помилка введення-виведення”); } finally {

try { socket.close();

} catch (IOExeption e) { System.err.println(“Роз’єм не був закритий”);

}

threadcount--;

}

}

}

public class MultiJabberClient { static final int MAX_THREADS = 40; public static void main (String [] args)

throws IOExeption, InterruptedExeption { ItemAddress addr = ItemAddress.getByName(null); while(true) {

if(JabberClientThread. threadCount()<MAX_THREADS) new JabberClientThread(addr); Thread.currentThread().sleep(100);

}

} }

Рекомендована література [8-10].

144

Тема 20. ПАКЕТИ І АРХІВАЦІЯ В JAVA

Вивчивши матеріал теми, студенти знатимуть:

документування класів за допомогою Javadoc;

архівування за допомогою програми JAR;

як виконується завантаження аплета;

технологію створення пакета;

шляхи формування архіву;

механізм розміщення в архіві цифрового підпису;

процеси підготовки класу як компонента JavaBean. Вивчення матеріалу теми допоможе студентам:

запускати аплет із архіву JAR;

формувати обробник виключень;

запускати програми з архіву JAR;

генерувати пари ключів;

використовувати упаковку компонента в архів JAR;

упаковувати сервлети до файла WAR;

закріпляти дії з роботи з JAR-файлами в програмах.

20.1.Навчальні завдання для виконання практичної роботи

Мета роботи: закріпити теоретичні знання щодо механізмів створення пакетів і упаковок та визначати їхню практичну сутність.

План

1.Традиційні методи архівації.

2.Характеристика типових ситуацій при запуску програм із архіву.

3.Підвищення якості архівації програми шляхом опрацювання можливих помилок.

4.Упаковка програми завдяки використанню методу JAR.

5.Опрацювання документів програмою Javadoc.

6.Забезпечення електронного розповсюдження додатка.

7.Характеристика методів, які генерують цифровий підпис.

20.2.Завдання для опрацювання самостійної роботи

Навчальні завдання

1.Механізм створення пакета.

2.Функціональні можливості програми JAR.

3.Технологія запуску аплета з архіву JAR.

4.Схема запуску програми з архіву JAR.

5.Запуск аплета із середовища JBuilder.

6.Упакування сервлета до файла WAR.

7.Упакування компонента до архіву JAR.

8.Забезпечення електронного розповсюдження додатка.

Рекомендована література [14,15].

145

Тема 21. РОЗРОБЛЕННЯ БАГАТОПОТОЧНИХ ДОДАТКІВ

Вивчивши матеріал теми, студенти знатимуть:

що являє собою потік команд;

як відбувається конкурентне використання процесора;

процедуру створення нових потоків;

класи, які розширюють клас Thread;

шляхи реалізації інтерфейса Runnable;

механізм опису класа TRaser;

процеси створення синхронізованих класів. Вивчення матеріалу теми допоможе студентам:

визначати критичні сегменти програми для захисту;

формувати дії захисту методів в цілому;

залучати взаємне блокування процесів;

координувати роботу потоків за допомогою функцій wait() й notify();

закріпляти дії, які відбуваються за допомогою додатку TRaceApplet.

21.1.Навчальні завдання для виконання практичної роботи

Мета роботи: закріпити теоретичні знання розробки багатопоточних додатків.

План

1.Чутливі користувацькі інтерфейси.

2.Успадкування від потоку Thread.

3.Використання потоків для створення чутливого інтерфейсу.

4.Формування вільної кількості потоків.

5.Сумісне використання обмежених ресурсів.

6.Блокування. Перехід до блокованого стану.

7.Пріоритети. Читання та установлення пріоритетів.

8.Групи потоків та їх застосування.

21.2.Перелік завдань для опрацювання лабораторної роботи

Лабораторна робота

«Багатопоточність у клієнтських додатках»

Завдання. Поглибити і закріпити знання з таких питань:

синхронізація підпроцесів;

узгодження дій декількох підпроцесів;

виявити пріоритети підпроцесів;

запускати приклади підпроцесів;

формувати групи підпроцесів.

План заняття

1.Провести десятихвилинне опитування, з’ясувати рівень засвоєння студентами термінів

іпонять цієї теми.

2.Розробити схему виконання конкретного прикладу.

3.Виконати аналіз виконання запропонованого викладачем завдання.

4.Скласти звіт з лабораторної роботи і захистити його.

Інформаційне забезпечення

1.Перелік завдань для виконання лабораторної роботи.

2.Серверне програмне середовище.

146

Навчальні приклади для виконання лабораторної роботи

Приклад 1. Формування потоку в додатку.

import

javax.swing.*;

import

java.awt.event.*;

import

java.awt.*;

import

com.bruceeckel.swing.*;

public class Counter1 extends JApplet { private int count = 0;

private JButton

start = new JButton (“Розпочати”), on0ff = new JButton (“Перемикнути”);

private JTextField t = new JTextField(10); private boolean runFlag = true;

public void init() {

Container cp = getContentPane(); cp.setLayout (new FlowLayout()); cp.add(t); start.addActionLisener(new StartL()); cp.add(start);

on0ff.addActionLisener(new 0n0ffL()); cp.add(on0ff);

}

public void go() { while (true) { try {

Thread.sleep(100); } catch(InterruptedException e) {

System.err.println(“Виконання перерване”);

}

if (runFlag) t.setText(Integer.toString(count++));

}

}

class StartL implements ActionListener {

public void actionPerformed(ActionEvent e) { go();

}

}

class 0n0ffL implements ActionListener {

public void actionPerformed(ActionEvent e) { runFlag = !runFlag;

}

}

public static void main(Sting[] args) { Console.run(new Counter1(), 300, 100);

}

}

Приклад 2. Простий приклад з використанням потоків. public class SimpleThread extends Thread {

private int countdown = 5; private static int threadCount = 0;

private int threadNumber = ++threadCount ; public SimpleThread() {

System.out.println(“Cтворення” + threadNumber);

}

public void run() { while (true) {

147

System.out.println(“Потік ” + threadNumber + “(“ + countdown + “)”); if (--countDown == 0) return;

}

}

public static void main(Sting[] args) { for (int i = 0; i<5; i++)

new SimpleThread().start(); System.out.println(“Усі потоки запущені”);

}

}

Приклад 3. Чутливий користувацький інтерфейс із потоками.

import

javax.swing.*;

import

java.awt.event.*;

import

java.awt.*;

import

com.bruceeckel.swing.*;

public class Counter2 extends JApplet

{

private class SeparateSubTask extends Thread {

private int count = 0;

 

private boolean runFlag = true;

 

SeparateSubTask()

{ start(); }

 

void invertFlag()

{ runFlag = ! runFlag ; }

public void run()

{

 

while (true) {

 

 

try

{

 

 

}

sleep(100);

 

 

 

{

catch(InterruptedException e)

System.err.println(“ Перервано”); }

 

if (runFlag)

 

 

 

t.setText(Integer.toString(count++));

}

 

 

 

}

 

 

 

}

 

 

 

private SeparateSubTask sp = null;

 

private JTextField

t = new JTextField(10);

private JButton

 

 

 

start = new JButton (“Почати”),

on0ff = new JButton (“Переключити”); class StartL implements ActionListener { public void actionPerformed(ActionEvent e) {

if (sp == null)

sp = new SeparateSubTask();

}

}

class 0n0ffL implements ActionListener { public void actionPerformed(ActionEvent e) {

if (sp ! == null) sp.invertFlag();

}

}

public void init() {

Container cp = getContentPane(); cp.setLayout (new FlowLayout()); cp.add(t); start.addActionLisener(new StartL()); cp.add(start);

on0ff.addActionLisener(new 0n0ffL()); cp.add(on0ff);

148

}

public static void main(Sting[] args) { Console.run(new Counter1(), 300, 100);

}

}

Приклад 4. Використання інтерфейсу Runnable для перетворення головного класу на потік. import javax.swing.*;

import java.awt.event.*; import java.awt.*;

import com.bruceeckel.swing.*;

public class Counter3 extends JApplet implements Runnable { private int count = 0;

private boolean runFlag = true; private Thread selfThread = null;

private JButton

start = new JButton (“Розпочати”), on0ff = new JButton (“Перемикнути”);

private JTextField t = new JTextField(10); public void run() {

while (true) { try {

selfThread.sleep(100);

}

catch(InterruptedException e) { System.err.println(“ Перервано”); } if (runFlag) t.setText(Integer.toString(count++));

}

}

class StartL implements ActionListener { public void actionPerformed(ActionEvent e) {

if (selfThread == null) {

selfThread = new Thread(Counter3.this); selfThread.start(); }

}

}

class 0n0ffL implements ActionListener { public void actionPerformed(ActionEvent e) { runFlag = !runFlag;

}

}

public void init() {

Container cp = getContentPane(); cp.setLayout (new FlowLayout()); cp.add(t); start.addActionLisener(new StartL()); cp.add(start);

on0ff.addActionLisener(new 0n0ffL()); cp.add(on0ff);

}

public static void main(Sting[] args) { Console.run(new Counter1(), 300, 100);

}

}

Приклад 5. Запуск повільної кількості потоків. import javax.swing.*;

149

import java.awt.event.*; import java.awt.*;

import com.bruceeckel.swing.*;

public class Counter4 extends JApplet { private int size = 12;

private JButton

start = new JButton (“Розпочати”); private boolean started = false; private Ticker[] s;

private boolean isApplet = true; class Ticker extends Thread {

private JButton

b = new JButton (“Перемикнути”); private JTextField t = new JTextField(10); private int count = 0;

private boolean runFlag = true; public Ticker() {

b.addActionListener(new ToggleL()); JPanel p = new JPanel();

p.add(t);

p.add(b);

//

getContentPane().add(p);

}

class ToggleL implements ActionListener { public void actionPerformed(ActionEvent e) { runFlag = !runFlag;

}

}

public void run() { while (true) {

if(runFlag)

t.setText(Integer.toString(count++)); try {

sleep(100);

}

catch(InterruptedException e) { System.err.println(“ Перервано”); }

}

}

}

class StartL implements ActionListener { public void actionPerformed(ActionEvent e) {

if(!started) { started = true;

for (int i = 0; i <s.length; i++) s[i].start();

}

}

}

public void init() { Container cp = getContentPane(); cp.setLayout (new FlowLayout());

//

if (isApplet) {

String sz = getParameter(“size”); if (sz ! = null)

size = Integer.parseInt(sz);

150