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);
}
}
Hosted by uCoz