Опубликован: 10.10.2010 | Уровень: специалист | Доступ: платный
Лекция 4:

Пример использования API java.net

< Лекция 3 || Лекция 4: 1234 || Лекция 5 >
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  }
Листинг 4.2. Класс BillingClientService

Класс BillingClient

Что касается клиентского приложения, то в данном случае оно устроено очень просто. Сетевое имя сервера оно принимает в качестве аргумента командной строки, порт известен заранее. Первое, что делается, - устанавливается соединение с сервером (метод connectToServer).Затем создаются три новые карты с разными идентификаторами. Создаются они с помощью метода sendNewCardOperation,который действует в соответствии с установленными нами протоколом: он записывает в поток сначала код операции, затем имя владельца карты, затем его идентификатор.

После создания карт в цикле выполняется метод sendAddMoneyOperation,который посылает серверу команды об увеличении баланса для только что добавленных карт. Цикл выполняется 1000 раз, поэтому средств на каждой из карт в итоге оказывается много.

С помощью вызовов sendGetCardBalanceOperation в качестве параметра которого передается идентификатор карты, мы можем в этом убедиться.

Все реализованные в клиентском приложении методы: send NewCardOperation, sendAddMoneyOperation, sendSubMoneyOperation, sendGetCardBalanceOperation, closeConnection - "симметричны" соответствующим методам BillingClientService и неукоснительно соблюдают разработанный протокол.

1  package com.asw.net.ex1;
2  import java.net.*;
3  import java.io.*;
4  
5  public class BillingClient {
6  int serverPort = 7896;
7  String serverName;
8  Socket s;
9  DataInputStream dis;
10  DataOutputStream dos;
11  
12  public BillingClient(String serverName){
13    this.serverName = serverName;
14  }
15  
16  public static void main(String[] args) {
17    BillingClient bc = new BillingClient(args[0]);
18    try {
19      bc.startTest();
20    } catch (IOException e) {
21      e.printStackTrace();
22    }
23  }
24  
25  public void startTest() throws IOException{
26    connectToServer();
27    sendNewCardOperation("Piter","1");
28    sendNewCardOperation("Stefan","2");
29    sendNewCardOperation("Nataly","3");
30    for (int i=0; i<1000;i++){
31      sendAddMoneyOperation("1", i%10);
32      sendAddMoneyOperation("2", i%20);
33      sendAddMoneyOperation("3", i%30);
34    }
35    System.out.println("1:"+sendGetCardBalanceOperation("1"));
36    System.out.println("2:"+sendGetCardBalanceOperation("2"));
37    System.out.println("3:"+sendGetCardBalanceOperation("3"));
38    closeConnection();
39  }
40  
41  void connectToServer() throws UnknownHostException, IOException{
42    s = new Socket(serverName, serverPort);
43    dis = new DataInputStream(s.getInputStream());
44    dos = new DataOutputStream(s.getOutputStream());
45  }
46  
47  void sendNewCardOperation(String personName, String card) throws IOException{
48    dos.writeInt(BillingService.ADD_NEW_CARD);
49    dos.writeUTF(personName);
50    dos.writeUTF(card);
51  }
52  
53  void sendAddMoneyOperation(String card, double money) throws IOException{
54    dos.writeInt(BillingService.ADD_MONEY);
55    dos.writeUTF(card);
56    dos.writeDouble(money);
57  }
58  void sendSubMoneyOperation(String card, double money) throws IOException{
59    dos.writeInt(BillingService.SUB_MONEY);
60    dos.writeUTF(card);
61    dos.writeDouble(money);
62  }
63  double sendGetCardBalanceOperation(String card) throws IOException{
64    dos.writeInt(BillingService.GET_CARD_BALANCE);
65    dos.writeUTF(card);
66    return dis.readDouble();
67  }
68  void closeConnection() throws IOException{
69    dos.writeInt(BillingService.EXIT_CLIENT);
70  }
71  }
Листинг 4.3. Класс BillingClient
< Лекция 3 || Лекция 4: 1234 || Лекция 5 >
Алмаз Мурзабеков
Алмаз Мурзабеков
Прохожу курс "Построение распределенных систем на Java" в третьей лекции где описывается TCPServer вылетает эта ошибка
"Connection cannot be resolved to a type"


Java version 1.7.0_05
Александр Хвостов
Александр Хвостов
Россия
Максим Лютов
Максим Лютов
Россия, СПб, Политех, 2012