игра брюс 2048
Главная / Программирование / Построение распределенных систем на Java / Тест 4

Построение распределенных систем на Java - тест 4

Упражнение 1:
Номер 1
В каком методе класса BillingService происходит создание соединений с клиентами:
1  package com.asw.net.ex1;
2  import java.net.*;
3  import java.util.Hashtable;
4  import java.io.*;
5  
6  public class BillingService extends Thread{
7  public static final int ADD_NEW_CARD = 1;
8  public static final int ADD_MONEY = 2;
9  public static final int SUB_MONEY = 3;
10  public static final int GET_CARD_BALANCE = 4;
11  public static final int EXIT_CLIENT = 5;
12  
13  private int serverPort = 7896;
14  private ServerSocket ss;
15  private  Hashtable hash;
16  
17  public static void main(String[] args) {
18    BillingService bs = new BillingService();
19    bs.start();
20  }
21  
22  public BillingService(){
23    hash = new Hashtable();
24  }
25  
26  public void run(){
27    try {
28      ss = new ServerSocket(serverPort);
29      System.out.println("Server started");
30      while(true){
31        Socket s = ss.accept();
32        System.out.println("Client accepted");
33        BillingClientService bcs = new BillingClientService(this, new DataInputStream(s.getInputStream()), 
              new DataOutputStream(s.getOutputStream()));
34        bcs.start();
35      }
36    } catch (IOException e) {
37      e.printStackTrace();
38    }
39  }
40  
41  public void addNewCard(String personName, String card) {
42    hash.put(card, new Double(0.0));
43  }
44  public void addMoney(String card, double money) {
45    Double d = (Double)hash.get(card);
46    if (d!=null) hash.put(card,new Double(d.doubleValue()+money));
47  }
48  public void subMoney(String card, double money) {
49    Double d = (Double)hash.get(card);
50    if (d!=null) hash.put(card,new Double(d.doubleValue()-money));
51  }
52  public double getCardBalance(String card) {
53    Double d = (Double)hash.get(card);
54    if (d!=null) return d.doubleValue();
55    return 0;
56  }
57  }

Ответ:

 (1) методе main 

 (2) в конструкторе 

 (3) в методе run 


Номер 2
Класс BillingService унаследован от класса Thread, потому что:

Ответ:

 (1) любой класс, использующий пакет java.net должен быть унаследован от Thread 

 (2) в методе main запускается несколько экземпляров BillingService, которые должны работать параллельно 

 (3) по условиям задачи сервер должен уметь обрабатывать сообщения, поступающие от нескольких клиентов одновременно 


Номер 3
Класс BillingService
производит непосредственное чтение данных, передаваемых клиентом в методе:
1  package com.asw.net.ex1;
2  import java.net.*;
3  import java.util.Hashtable;
4  import java.io.*;
5  
6  public class BillingService extends Thread{
7  public static final int ADD_NEW_CARD = 1;
8  public static final int ADD_MONEY = 2;
9  public static final int SUB_MONEY = 3;
10  public static final int GET_CARD_BALANCE = 4;
11  public static final int EXIT_CLIENT = 5;
12  
13  private int serverPort = 7896;
14  private ServerSocket ss;
15  private  Hashtable hash;
16  
17  public static void main(String[] args) {
18    BillingService bs = new BillingService();
19    bs.start();
20  }
21  
22  public BillingService(){
23    hash = new Hashtable();
24  }
25  
26  public void run(){
27    try {
28      ss = new ServerSocket(serverPort);
29      System.out.println("Server started");
30      while(true){
31        Socket s = ss.accept();
32        System.out.println("Client accepted");
33        BillingClientService bcs = new BillingClientService(this, new DataInputStream(s.getInputStream()), 
                  new DataOutputStream(s.getOutputStream()));
34        bcs.start();
35      }
36    } catch (IOException e) {
37      e.printStackTrace();
38    }
39  }
40  
41  public void addNewCard(String personName, String card) {
42    hash.put(card, new Double(0.0));
43  }
44  public void addMoney(String card, double money) {
45    Double d = (Double)hash.get(card);
46    if (d!=null) hash.put(card,new Double(d.doubleValue()+money));
47  }
48  public void subMoney(String card, double money) {
49    Double d = (Double)hash.get(card);
50    if (d!=null) hash.put(card,new Double(d.doubleValue()-money));
51  }
52  public double getCardBalance(String card) {
53    Double d = (Double)hash.get(card);
54    if (d!=null) return d.doubleValue();
55    return 0;
56  }
57  }

Ответ:

 (1) run 

 (2) конструкторе 

 (3) класс не содержит методов, осуществляющих непосредственное чтение данных, передаваемых клиентом 


Упражнение 2:
Номер 1
В какой строке происходит прием соединения клиента (класс BillingService):
1  package com.asw.net.ex1;
2  import java.net.*;
3  import java.util.Hashtable;
4  import java.io.*;
5  
6  public class BillingService extends Thread{
7  public static final int ADD_NEW_CARD = 1;
8  public static final int ADD_MONEY = 2;
9  public static final int SUB_MONEY = 3;
10  public static final int GET_CARD_BALANCE = 4;
11  public static final int EXIT_CLIENT = 5;
12  
13  private int serverPort = 7896;
14  private ServerSocket ss;
15  private  Hashtable hash;
16  
17  public static void main(String[] args) {
18    BillingService bs = new BillingService();
19    bs.start();
20  }
21  
22  public BillingService(){
23    hash = new Hashtable();
24  }
25  
26  public void run(){
27    try {
28      ss = new ServerSocket(serverPort);
29      System.out.println("Server started");
30      while(true){
31        Socket s = ss.accept();
32        System.out.println("Client accepted");
33        BillingClientService bcs = new BillingClientService(this, new DataInputStream(s.getInputStream()), 
               new DataOutputStream(s.getOutputStream()));
34        bcs.start();
35      }
36    } catch (IOException e) {
37      e.printStackTrace();
38    }
39  }
40  
41  public void addNewCard(String personName, String card) {
42    hash.put(card, new Double(0.0));
43  }
44  public void addMoney(String card, double money) {
45    Double d = (Double)hash.get(card);
46    if (d!=null) hash.put(card,new Double(d.doubleValue()+money));
47  }
48  public void subMoney(String card, double money) {
49    Double d = (Double)hash.get(card);
50    if (d!=null) hash.put(card,new Double(d.doubleValue()-money));
51  }
52  public double getCardBalance(String card) {
53    Double d = (Double)hash.get(card);
54    if (d!=null) return d.doubleValue();
55    return 0;
56  }
57  }

Ответ:

 (1) 31 

 (2) 19 

 (3) 34 


Номер 2
После выполнения какой строки сервер (класс BillingService) может принимать соединения клиентов:
1  package com.asw.net.ex1;
2  import java.net.*;
3  import java.util.Hashtable;
4  import java.io.*;
5  
6  public class BillingService extends Thread{
7  public static final int ADD_NEW_CARD = 1;
8  public static final int ADD_MONEY = 2;
9  public static final int SUB_MONEY = 3;
10  public static final int GET_CARD_BALANCE = 4;
11  public static final int EXIT_CLIENT = 5;
12  
13  private int serverPort = 7896;
14  private ServerSocket ss;
15  private  Hashtable hash;
16  
17  public static void main(String[] args) {
18    BillingService bs = new BillingService();
19    bs.start();
20  }
21  
22  public BillingService(){
23    hash = new Hashtable();
24  }
25  
26  public void run(){
27    try {
28      ss = new ServerSocket(serverPort);
29      System.out.println("Server started");
30      while(true){
31        Socket s = ss.accept();
32        System.out.println("Client accepted");
33        BillingClientService bcs = new BillingClientService(this, new DataInputStream(s.getInputStream()), new DataOutputStream(s.getOutputStream()));
34        bcs.start();
35      }
36    } catch (IOException e) {
37      e.printStackTrace();
38    }
39  }
40  
41  public void addNewCard(String personName, String card) {
42    hash.put(card, new Double(0.0));
43  }
44  public void addMoney(String card, double money) {
45    Double d = (Double)hash.get(card);
46    if (d!=null) hash.put(card,new Double(d.doubleValue()+money));
47  }
48  public void subMoney(String card, double money) {
49    Double d = (Double)hash.get(card);
50    if (d!=null) hash.put(card,new Double(d.doubleValue()-money));
51  }
52  public double getCardBalance(String card) {
53    Double d = (Double)hash.get(card);
54    if (d!=null) return d.doubleValue();
55    return 0;
56  }
57  }

Ответ:

 (1) 18 

 (2) 23 

 (3) 28 


Номер 3
Класс BillingService допускает одновременное подключение и передачу данных для какого числа клиентов:

Ответ:

 (1) 1, одновременная передача данных несколькими клиентами не допускается 

 (2)

 (3) нескольких, точное число зависит от системных настроек и количества свободных ресурсов узла 


Упражнение 3:
Номер 1
Класс BillingClientService унаследован от класса Thread, потому что:

Ответ:

 (1) все классы, работающие с пакетом java.net должны быть унаследованы от класса Thread 

 (2) класс представляет собой цикл чтения данных от клиента и их обработки, для того чтобы была возможность одновременно обрабатывать данные от нескольких клиентов, класс унаследован от Thread 

 (3) класс работает с потоками ввода/вывода (DataInputStream, DataOutputStream), поэтому должен быть унаследован от Thread 


Номер 2
Чтение из потока, в строке 21, в случае, если клиент после установки соединения не записал в поток никаких данных, приведет:
1  package com.asw.net.ex1;
2  import java.io.*;
3  
4  public class BillingClientService extends Thread {
5  DataInputStream dis;
6  DataOutputStream dos;
7  BillingService bs;
8  
9  public BillingClientService (BillingService bs,DataInputStream dis,DataOutputStream dos){
10    this.bs = bs;
11    this.dis = dis;
12    this.dos = dos;
13  }
14  
15  public void run(){
16    System.out.println("ClientService thread started");
17    boolean work = true;
18    while (work) {
19      int command;
20      try {
21        command = dis.readInt();
22        switch (command) {
23        case BillingService.ADD_NEW_CARD:
24          addNewCard();
25          break;
26        case BillingService.ADD_MONEY:
27          addMoney();
28          break;
29        case BillingService.SUB_MONEY:
30          subMoney();
31          break;
32        case BillingService.GET_CARD_BALANCE:
33          getCardBalance();
34          break;
35        case BillingService.EXIT_CLIENT:
36          work = false;
37          break;
38        default:
39          System.out.println("Bad operation:" + command);
40        }
41      } catch (IOException e) {
42        e.printStackTrace();
43      }
44    }
45  }
46  
47  void addNewCard() throws IOException{
48    String personName = dis.readUTF();
49    String card = dis.readUTF();
50    bs.addNewCard(personName,card);
51  }
52  void addMoney() throws IOException{
53    String card = dis.readUTF();
54    double money = dis.readDouble();
55    bs.addMoney(card,money);
56  }
57  void subMoney() throws IOException{
58    String card = dis.readUTF();
59    double money = dis.readDouble();
60    bs.subMoney(card,money);
61  }
62  void getCardBalance() throws IOException{
63    String card = dis.readUTF();
64    double money = bs.getCardBalance(card);
65    dos.writeDouble(money);
66  }
67  }

Ответ:

 (1) к ошибке, на момент вызова метода readInt (строка 21) данные должны быть уже переданы со стороны клиента 

 (2) метод будет заблокирован до момента поступления данных со стороны клиента или обрыва соединения 

 (3) метод возвратит 0 


Номер 3
В случае если клиент завершит соединение, не послав предварительно сигнал EXIT_CLIENT:
1  package com.asw.net.ex1;
2  import java.io.*;
3  
4  public class BillingClientService extends Thread {
5  DataInputStream dis;
6  DataOutputStream dos;
7  BillingService bs;
8  
9  public BillingClientService (BillingService bs,DataInputStream dis,DataOutputStream dos){
10    this.bs = bs;
11    this.dis = dis;
12    this.dos = dos;
13  }
14  
15  public void run(){
16    System.out.println("ClientService thread started");
17    boolean work = true;
18    while (work) {
19      int command;
20      try {
21        command = dis.readInt();
22        switch (command) {
23        case BillingService.ADD_NEW_CARD:
24          addNewCard();
25          break;
26        case BillingService.ADD_MONEY:
27          addMoney();
28          break;
29        case BillingService.SUB_MONEY:
30          subMoney();
31          break;
32        case BillingService.GET_CARD_BALANCE:
33          getCardBalance();
34          break;
35        case BillingService.EXIT_CLIENT:
36          work = false;
37          break;
38        default:
39          System.out.println("Bad operation:" + command);
40        }
41      } catch (IOException e) {
42        e.printStackTrace();
43      }
44    }
45  }
46  
47  void addNewCard() throws IOException{
48    String personName = dis.readUTF();
49    String card = dis.readUTF();
50    bs.addNewCard(personName,card);
51  }
52  void addMoney() throws IOException{
53    String card = dis.readUTF();
54    double money = dis.readDouble();
55    bs.addMoney(card,money);
56  }
57  void subMoney() throws IOException{
58    String card = dis.readUTF();
59    double money = dis.readDouble();
60    bs.subMoney(card,money);
61  }
62  void getCardBalance() throws IOException{
63    String card = dis.readUTF();
64    double money = bs.getCardBalance(card);
65    dos.writeDouble(money);
66  }
67  }

Ответ:

 (1) экземпляр BillingClientService никогда не завершит свою работу (не выйдет из метода run

 (2) экземпляр BillingClientService завершит свою работу 

 (3) возникнет системная ошибка, все экземпляры BillingClientService завершат свою работу 


Упражнение 4:
Номер 1
Протокол обмена данными между клиентом и сервером, предложенный в первой части лекции обладает следующими недостатками:

Ответ:

 (1) ошибка в передаче одной команды может привести к неправильной интерпретации всех последующих команд 

 (2) для того чтобы добавить новую команду, необходимо изменять схему наследования классов системы 

 (3) протокол требует, чтобы и клиент и сервер были запущены на одном узле 


Номер 2
Для того чтобы указать системе на то, что экземпляры класса могут быть сохранены в поток/прочитаны из потока, необходимо:

Ответ:

 (1) объявить публичный класс, указав что он наследует от InputStream 

 (2) объявить публичный класс, указав, что он реализует интерфейс Serializable 

 (3) объявить публичный класс, указав что он наследует от OutputStream 


Номер 3
Класс, объявленный как реализующий интерфейс Serializable, обязательно должен удовлетворять следующим условиям:

Ответ:

 (1) иметь единственный конструктор, не принимающий аргументов 

 (2) иметь только поля, не иметь методов 

 (3) иметь только поля системных типов данных. Поля пользовательских типов данных - не допускаются 


Упражнение 5:
Номер 1
При передаче экземпляров CardOperation по сети, передаются:

Ответ:

 (1) копии объектов, после передачи данных они могут быть независимо изменены на клиенте и сервере 

 (2) ссылка на объект, после изменения которой на сервере, меняется объект на клиенте 

 (3) сам объект непосредственно. После передачи он перестает существовать на клиенте и доступен только на сервере 


Номер 2
При передаче объектов, с использованием ObjectOutputStream/ObjectInputStream:

Ответ:

 (1) после создания потока по нему можно передавать только объекты одного класса, в случае, если необходимо передавать объекты нескольких классов, необходимо создавать несколько экземпляров потоков ввода/вывода 

 (2) после создания потока ввода/вывода по нему можно передавать объекты разных классов 

 (3) после создания потока ввода/вывода по нему можно передавать объекты разных классов, однако объекты одного класса должны быть явно отделены от объектов другого класса специальным разделителем 


Номер 3
Метод readObject, в строке 32 , в случае, если клиент после установки соединения не записал в поток никаких данных, приведет:
1  package com.asw.net.ex2;
2  import java.io.*;
3  import java.net.*;
4  
5  public class BillingClientService extends Thread {
6  ObjectInputStream ois;
7  ObjectOutputStream oos;
8  BillingService bs;
9  Socket s;
10  
11  public BillingClientService(BillingService bs,Socket s){
12    System.out.println("Constructor BillingClientService\n");
13    this.bs = bs;
14    this.s = s;
15    try {
16      this.oos = new ObjectOutputStream(s.getOutputStream());
17      this.ois = new ObjectInputStream(s.getInputStream());
18    } catch (IOException e) {
19      // TODO Auto-generated catch block
20      e.printStackTrace();
21    }
22    
23    System.out.println("Stream`s done \n socket="+s);
24  }
25  public void run(){
26    System.out.println("ClientService thread started\n");
27    boolean work = true;
28    while (work) {
29      int command;
30      Object o;
31      try {
32        o = ois.readObject();              
33        if (o instanceof Card[]) {
34          Card[] cards = (Card[])o;
35          for (int i=0;i<cards.length;i++){
36            bs.addNewCard(cards[i]);
37          }
38        }else if (o instanceof CardOperation[]){
39          CardOperation[] co = (CardOperation[])o;
40          for (int i=0;i<co.length;i++){
41            bs.addMoney(co[i].card,co[i].amount);
42          }
43        }else if (o instanceof String){
44          oos.writeObject(bs.getCard((String)o)); 
45        }else System.out.println("Bad operation");
46        
47      } catch (IOException e) {
48        e.printStackTrace();
49      } catch (ClassNotFoundException e) {
50        e.printStackTrace();
51      }
52    }
53  }
54  }

Ответ:

 (1) к ошибке, на момент вызова метода readObject (строка 32) данные должны быть уже переданы со стороны клиента 

 (2) метод будет заблокирован до момента поступления данных со стороны клиента или обрыва соединения 

 (3) метод возвратит null 


Упражнение 6:
Номер 1
Какие из следующих утверждений являются верными:

Ответ:

 (1) для того чтобы передать несколько объектов одного типа по сети, можно создать из этих объектов массив и передать его 

 (2) все объекты, передаваемые по сети с помощью механизме сериализации, должны принадлежать классам, реализующим интерфейс Serializable 

 (3) класс, реализующий интерфейс Serializable, обязан реализовать метод saveObject этого интерфейса 


Номер 2
Какие из следующих утверждений являются верными:

Ответ:

 (1) механизм сериализации использует снимки памяти, поэтому не может быть использован для переноса объектов между узлами разной аппаратной архитектуры 

 (2) механизм сериализации позволяет сохранить состояние метода объекта в процессе его работы таким образом, что после восстановления, метод продолжит свою работу с того момента, на котором он был остановлен 

 (3) механизм сериализации сохраняет лишь значение полей объекта, но не сохраняет состояния его методов в процессе их выполнения 


Номер 3
Какие из следующих утверждений являются верными:

Ответ:

 (1) не существует способа указать системе при сериализации объекта, что какие-то его поля не должны сохраняться и затем передаваться 

 (2) при передаче объекта, всегда полностью передается описание его класса, таким образом для сериализации подходят только "короткие" объекты, не содержащие длинных сложных методов 

 (3) механизм сериализации сохраняет лишь значение полей объекта, но не сохраняет состояния его методов в процессе их выполнения 




Главная / Программирование / Построение распределенных систем на Java / Тест 4