import java.io.*; // Импорт используемых пакетов. import java.net.*; /** * Это приложение получает информацию о курсе акций * посредством нового прикладного протокола. * @author David W. Baker * Автор Дэвид Бейкер * 0version 1.1 * Версия 1.1 V */ public class StockQuoteClient{ // Сервер слушает этот порт. private static final int SERVER_PORT = 1701; private String serverName; // имя сервера private Socket quoteSocket = null; // сокет private DataInputStream quoteReceive = null; private PrintStream quoteSend = null; private String[] stockIDs; // Массив идентификаторов акций. private String[] stockInfo; // Массив возвращаемых значений. private String currentAsOf = null; // Время обновления данных. /** * Запуск приложения: проверка параметров * командной строки, создание объекта StockQuoteClient и * вызов его метода, выводящего данные. * @param args Arguments which should be * args параметры командной строки, которые должны * иметь вид <сервер> <идентификаторы акций> */ public static void main(String[] args) { if (args.length < 2) { System.out.println( "Usage: StockQuoteClient "); // "Использование: StockQuoteClient <идентификаторы акций>" System.exit(1) ; } StockQuoteClient client = new StockQuoteClient(args); client.printQuotes(System.out); System.exit(0); } /** * Конструктор обеспечивает получение * информации об акциях. */ public StockQuoteClient(String[] args) { String serverInfo; // Первый параметр - имя сервера. serverName = args[0]; // Создать массив длиной на 1 меньше, чем args. stockIDs = new String[args.length-1]; stockInfo = new String[args.length-1]; // Скопировать аргументы в массив stockIDs[]. for (int index = 1; index < args.length; index++) { stockIDs[index-1] = args[index]; } // Связаться с сервером и возвратить сообщение HELLO. serverInfo = contactServer(); // разобрать строку с временем. if (serverInfo != null) { currentAsOf = serverInfo.substring( serverInfo.indexOf(" ")+1); } getQuotes(); // Считать информацию. quitServer();// Закрыть соединение. } /** * Создать первичное соединение с сервером. * @return The initial connection response. * возвращаемое значение - ответ сервера при соединении */ protected String contactServer() { String serverWelcome = null; // ответ сервера try { // Открыть сокет на сервере. quoteSocket = new Socket(serverName,SERVER_PORT); // Создать надстроенные потоки ввода/вывода. quoteReceive = new DataInputStream( quoteSocket.getInputStream() ) ; quoteSend = new PrintStream( quoteSocket.getOutputStream()); // Считать сообщение HELLO. serverWelcome = quoteReceive . readLine ( ) ; } catch (UnknownHostException excpt) { System.err.println("Unknown host " + serverName + // "Неизвестный хост" ": " + excpt) ; } catch (IOException excpt) { System.err.println("Failed I/O to " + serverName + // "Ошибка ввода/вывода" ": " + excpt) ; } return serverWelcome; // Вернуть сооСщение HELLO. } /** * Этот метод считывает всю информацию об акциях. */ protected void getQuotes ( ) { String response; // Ответ на запрос. // Если соединение в порядке. if (connectOK()) { try { // Цикл по всем акциям. for (int index = 0; index < stockIDs.length; index++) { // Послать запрос. quoteSend.println("STOCK: "+stockIDs[index]); // Получить ответ. response = quoteReceive . readLine ( ) ; // Разобрать полученные данные. stockInfo[index] = response.substring( response.indexOf(" ")+1); } } catch (IOException excpt) { System.err.println("Failed I/O to " + serverName // "Ошибка ввода/вывода" + ": " + excpt); } } } /** * Отключение от сервера. * @return The final message from the server. * Возвращаемое значение - последний ответ сервера */ protected String quitServer() { String serverBye = null; // сообщение BYE. try { // Если соединение действует, послать сообщение QOIT // и получить ответ BYE. if (connectOK()) { quoteSend.println("QUIT"); serverBye = quoteReceive.readLine(); } // Если ссьлки не равны null, // закрыть потоки и сокет. if (quoteSend != null) quoteSend.close(); if (quoteReceive != null) quoteReceive.close(); if (quoteSocket != null) quoteSocket.close(); } catch (IOException excpt) { System.err.println("Failed I/O to server " + // "Ошибка ввода/вывода" serverName + ": " + excpt); } return serverBye; // Сообщение BYE. } /** * Выдача результатов запроса * по различным акциям. * @param sendOutput Where to send output. * sendOutput - куда направлять вывод */ public void printQuotes(PrintStream sendOutput) { // В случае, если получено сообщение HELLO: if (currentAsOf != null) { sendOutput.print("INFORMATION ON REQUESTED QUOTES" + "\n\tCurrent As Of: " + currentAsOf + "\n\n"); // "Информация по..." // Цикл по всем акциям. for (int index = 0; index < stockIDs.length; index++) { sendOutput.print(stockIDs[index] + ":"); if (stockInfo[index] != null) sendOutput.println(" " + stockInfo[index]); else sendOutput.println() ; } } } /** * Убедиться, что сокет и потоки * отличны от null. * Sreturn If the connection is OK. * возвращаемое значение - true, если соединение действует */ protected boolean connectOK() { return (quoteSend != null && quoteReceive != null && quoteSocket != null); } }