HTTP в JAVA

Реализация веб-сервера будет разбита на две части: первая (класс HttpServer) будет отвечать за прием сообщений от клиентов, вторая (класс ClientSession) за их обработку.

Код класса HttpServer представлен ниже:
   
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * Обрабатывает запросы от клиентов, возвращая файлы, указанные 
 * в url-path или ответ с кодом 404, если такой файл не найден.
 *
 */
public class HttpServer {

   /**
    * Первым аргументом может идти номер порта.
    */
   public static void main(String[] args) {
      /* Если аргументы отсутствуют, порт принимает значение поумолчанию */
      int port = DEFAULT_PORT;
      if (args.length > 0) {
         port = Integer.parseInt(args[0]);
      }
      /* Создаем серверный сокет на полученном порту */
      ServerSocket serverSocket = null;
      try {
         serverSocket = new ServerSocket(port);
         System.out.println("Server started on port: "
               + serverSocket.getLocalPort() + "\n");
      } catch (IOException e) {
         System.out.println("Port " + port + " is blocked.");
         System.exit(-1);
      }
      /*
       * Если порт был свободен и сокет был успешно создан, можно переходить к
       * следующему шагу - ожиданию клинтов
       */
      while (true) {
         try {
            Socket clientSocket = serverSocket.accept();
            /* Для обработки запроса от каждого клиента создается
             * отдельный объект и отдельный поток */
            ClientSession session = new ClientSession(clientSocket);
            new Thread(session).start();
         } catch (IOException e) {
            System.out.println("Failed to establish connection.");
            System.out.println(e.getMessage());
            System.exit(-1);
         }
      }
   }

   private static final int DEFAULT_PORT = 9999;
}
   
Приведенный код не должен вызвать затруднений. В нем создается серверный сокет, и при каждом новом подключении клиента его обработка делегируется очередному объекту ClientSession.

Полный код  ClientSession приводится ниже, после идут небольшие пояснения к нему:
   
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Date;

/**
 * Обрабатывает запрос клиента.
 */
public class ClientSession implements Runnable {

   @Override
   public void run() {
      try {
         /* Получаем заголовок сообщения от клиента */
         String header = readHeader();         
         System.out.println(header + "\n");
         /* Получаем из заголовка указатель на интересующий ресурс */
         String url = getURIFromHeader(header);
         System.out.println("Resource: " + url + "\n");
         /* Отправляем содержимое ресурса клиенту */
         int code = send(url);
         System.out.println("Result code: " + code + "\n");
      } catch (IOException e) {
         e.printStackTrace();
      } finally {
         try {
            socket.close();
         } catch (IOException e) {
            e.printStackTrace();
         }
      }
   }

   public ClientSession(Socket socket) throws IOException {
      this.socket = socket;
      initialize();
   }

   private void initialize() throws IOException {
      /* Получаем поток ввода, в который помещаются сообщения от клиента */
      in = socket.getInputStream();
      /* Получаем поток вывода, для отправки сообщений клиенту */
      out = socket.getOutputStream();
   }

   /**
    * Считывает заголовок сообщения от клиента.
    * 
    * @return строка с заголовком сообщения от клиента.
    * @throws IOException
    */
   private String readHeader() throws IOException {
      BufferedReader reader = new BufferedReader(new InputStreamReader(in));
      StringBuilder builder = new StringBuilder();
      String ln = null;
      while (true) {
         ln = reader.readLine();
         if (ln == null || ln.isEmpty()) {
            break;
         }
         builder.append(ln + System.getProperty("line.separator"));
      }
      return builder.toString();
   }

   /**
    * Вытаскивает идентификатор запрашиваемого ресурса из заголовка сообщения от
    * клиента.
    * 
    * @param header
    *           заголовок сообщения от клиента.
    * @return идентификатор ресурса.
    */
   private String getURIFromHeader(String header) {
      int from = header.indexOf(" ") + 1;
      int to = header.indexOf(" ", from);
      String uri = header.substring(from, to);
      int paramIndex = uri.indexOf("?");
      if (paramIndex != -1) {
         uri = uri.substring(0, paramIndex);
      }
      return DEFAULT_FILES_DIR + uri;
   }

   /**
    * Отправляет ответ клиенту. В качестве ответа отправляется http заголовок и
    * содержимое указанного ресурса. Если ресурс не указан, отправляется
    * перечень доступных ресурсов.
    * 
    * @param url
    *           идентификатор запрашиваемого ресурса.
    * @return код ответа. 200 - если ресурс был найден, 404 - если нет.
    * @throws IOException
    */
   private int send(String url) throws IOException {
      InputStream strm = HttpServer.class.getResourceAsStream(url);
      int code = (strm != null) ? 200 : 404;
      String header = getHeader(code);
      PrintStream answer = new PrintStream(out, true, "UTF-8");
      answer.print(header);
      if (code == 200) {
         int count = 0;
         byte[] buffer = new byte[1024];
         while((count = strm.read(buffer)) != -1) {
            out.write(buffer, 0, count);
         }
         strm.close();
      }
      return code;
   }

   /**
    * Возвращает http заголовок ответа.
    * 
    * @param code
    *           код результата отправки.
    * @return http заголовок ответа.
    */
   private String getHeader(int code) {
      StringBuffer buffer = new StringBuffer();
      buffer.append("HTTP/1.1 " + code + " " + getAnswer(code) + "\n");
      buffer.append("Date: " + new Date().toGMTString() + "\n");
      buffer.append("Accept-Ranges: none\n");
      buffer.append("\n");
      return buffer.toString();
   }

   /**
    * Возвращает комментарий к коду результата отправки.
    * 
    * @param code
    *           код результата отправки.
    * @return комментарий к коду результата отправки.
    */
   private String getAnswer(int code) {
      switch (code) {
      case 200:
         return "OK";
      case 404:
         return "Not Found";
      default:
         return "Internal Server Error";
      }
   }

   private Socket socket;
   private InputStream in = null;
   private OutputStream out = null;
   
   private static final String DEFAULT_FILES_DIR = "/www";
}


 Первое, что делает ClientSession - это получает содержимое запроса и выводит его в стандартный поток вывода. Т.к. данная реализация не предусматривает реакции на параметры запроса, то тело запроса не представляет интереса и чтение самого запроса ограничивается только его заголовком: 

if (ln == null || ln.isEmpty()) {
   break;
}
Далее, из заголовка сообщения получается url запрашиваемого ресурса. В соответствии с протоколом http, url вытаскивается из первой строки заголовка как подстрока между первыми двумя пробелами. От url отрезаются параметры запроса (если они присутствуют). 

private String getURIFromHeader(String header) {
   int from = header.indexOf(" ") + 1;
   int to = header.indexOf(" ", from);
   String uri = header.substring(from, to);
   int paramIndex = uri.indexOf("?");
   if (paramIndex != -1) {
      uri = uri.substring(0, paramIndex);
   }
   return DEFAULT_FILES_DIR + uri;
}

Для удобства, корневой директорией сервера считается папка www, но это всего лишь несущественная условность.

Для ответа клиенту формируется простейший http заголовок, указывающий код ответа. Доступны два кода: 200 - если запрашиваемый ресурс был найден и всеми любимый 404 - если ресурса не оказалось. Дополнительно в заголовке указывается время и тот факт, что сервер не поддерживает докачку файлов (оба поля не существенны и приводятся чисто формально).

private String getHeader(int code) {
   StringBuffer buffer = new StringBuffer();
   buffer.append("HTTP/1.1 " + code + " " + getAnswer(code) + "\n");
   buffer.append("Date: " + new Date().toGMTString() + "\n");
   buffer.append("Accept-Ranges: none\n");
   buffer.append("\n");
   return buffer.toString();
}

При отправке ответа ресурсы получаются несколько неординарным способом: 

private int send(String url) throws IOException {
   // Здесь можно было бы ожидать работу с классом File...
   InputStream strm = HttpServer.class.getResourceAsStream(url);
   int code = (strm != null) ? 200 : 404;
   String header = getHeader(code);
   PrintStream answer = new PrintStream(out, true, "UTF-8");
   answer.print(header);
   if (code == 200) {
      int count = 0;
      byte[] buffer = new byte[1024];
      while((count = strm.read(buffer)) != -1) {
         out.write(buffer, 0, count);
      }
      strm.close();
   }
   return code;
}
Это сделано для того, чтобы можно было уместить весь сервер в одном jar архиве.

Собранный проект вы можете взять здесь . Для запуска требуется java  версии 6 и выше. Команда для запуска проекта: java -jar webserver.jar <номер порта>. Номер порта можно не указывать, тогда сервер будет запущен на 9999 порту:
$>java -jar webserver.jar
Server started on port: 9999

Чтобы проверить работоспособность сервера, перейдите по адресу: http://localhost:9999/index.html В случае успеха должна открыться страница, которая лежит в папке www внутри jar архива с сервером. Для размещения собственных ресурсов на сервере просто добавьте их в папку www внутри архива и перейдите по ссылке http://localhost:9999/<путь>, где <путь> - это это путь к интересующему вас ресурсу относительно папки www внутри архива. Внимание! В <пути> в качестве разделителя необходимо использовать прямой слэш "/". Если путь будет содержать ссылку не на файл, а на директорию, будет выведено содержимое этой директории.

Содержимое, отправленное серверу можно увидеть в окне терминала из которого был запущен сервер. Помимо заголовка запроса будет выведен запрашиваемый адрес и код ответа сервера:
$>java -jar webserver.jar
Server started on port: 9999

GET /index.html HTTP/1.1
Host: localhost:9999
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:13.0) Gecko/20100101 Firefox/13.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive


Resource: /www/index.html

Result code: 200

Для прекращения работы сервера воспользуйтесь стандартной комбинацией клавиш Ctrl+C - See more at: http://www.dokwork.ru/2012/06/http-java-25-web-server.html#sthash.rzBQbmhk.dpuf

Подключение сканера к 1С Предприятие 8.3


Подключение сканера к 1С Предприятие 8.3 (обычные и управляемые формы)
Сначала с подключением к конфигурации на обычных формах. 

Открываем модуль обычного приложения и пишем вот такой код:

Перем Сканер Экспорт;

 

Процедура ПриНачалеРаботыСистемы() 

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

Попытка
   // Загрузка внешней компоненты
   ЗагрузитьВнешнююКомпоненту("D:\ChumakDV\БАЗЫ\8.2\Сканер\Scaner1C.dll");
Попытка
  // Создание объекта
  Сканер = Новый("AddIn.Scaner45");
  Сканер.OldVersion = 1;
  Исключение
  Сообщить("Объект не найден!");
КонецПопытки;
Исключение
  Сообщить("Внешняя компонента драйвера не найдена");
КонецПопытки;

КонецПроцедуры

 

Процедура ПриЗавершенииРаботыСистемы()

   // Отсоединение объекта
   Если Константы.СканерИспользуется.Получить() Тогда
      Сканер = 0; 
   КонецЕсли;

КонецПроцедуры
Перед этим нужно в каталог информационной базы скопировать файл Scaner1C.dll и зарегистрировать его через regsvr32.exe
Если все сделали правильно, то после запуска конфигурации в режиме обычного приложения, в меню Сервис - Параметры, должна появиться дополнительная вкладка "Драйвер сканера штрих-кода". В этой вкладке нужно настроить параметры сканера (порт, скорость, а также можно определить, к какому порту подключен сканер).


Получение информации со сканера.
Для этого используется процедура ВнешнееСобытие(Источник, Событие, Данные), где:
Источник - источник события
Событие - вид события, нам нужно событие BarCodeValue
Данные - данные, полученные со сканера.
Примеры обработок внешних событий:
// получаем штрихкод товара

Процедура ВнешнееСобытие(Источник, Событие, Данные)
   // данные со сканера ШК
   Если Событие = "BarCodeValue" Тогда
      ШКТовара = СокрЛП(Данные);
   КонецЕсли;
КонецПроцедуры

// открываем документ по штрихкоду

Процедура ВнешнееСобытие(Источник, Событие, Данные)

// данные со сканера ШК
Если Событие = "BarCodeValue" Тогда
ШКДок = СокрЛП(Данные);
НайтиИОткрытьДокумент(ШКДок);
КонецЕсли;

КонецПроцедуры

Процедура НайтиИОткрытьДокумент(ШКДок)

Попытка
ДокПриходная = Документы.Приходная.НайтиПоРеквизиту("ШКДокумента", ШКДок);
ДокПриходная.ПолучитьФорму("ФормаДокумента").Открыть();
Исключение
Сообщить("Документ со штрихкодом " + СокрЛП(ШКДок) + " не найден!");
КонецПопытки;

КонецПроцедуры

Подключение сканера в режиме управляемого приложения.
Осуществляется такой же функцией ЗагрузитьВнешнююКомпоненту. Единственное отличие - код для загрузки нужно прописать в модуле управляемого приложения. Запуск программы нужно производить в режиме толстого клиента, иначе компонента не загрузится.
Если все сделали правильно, то в конфигурации в режиме управляемых форм появится вкладка с подключенным драйвером. 

Работа с данными сканера осуществляется также с помощью процедуры ВнешнееСобытие.

История возникновения и развития Java


Данная статья является сокращенным переводом известной статьи Майкла О'Коннелла "Java: The inside story", написанной им для журнала SunWorld Online в июле 1995 г. Статья интересна не только тем, что в ней история возникновения языка Java рассказывается его непосредственными создателями, но и тем, что с ее публикации фактически началась история самого журнала JavaWorld, а автор статьи стал главным редактором этого издания. Читая статью, не забывайте, что она написана больше двух лет назад, а за это время многие взгляды создателей Java на дальнейшее развитие этой технологии безнадежно устарели (по этой причине мы не публикуем раздел статьи, названный "Заглядывая в будущее"). 

Сегодня технология Java предоставляет средства для превращения статических Web-страниц в интерактивные динамические документы и для создания распределенных не зависящих от платформы приложений. Первоначально же язык Java корпорации Sun предназначался для устройств бытовой электроники, и в некоторых из них еще может использоваться его ранний вариант, известный под названием Oak. Однако настоящей стартовой площадкой для стремительного взлета Java стала сеть Internet.
Некоторые полагают, что для успеха любого дела прежде всего необходимо продумать и четко поставить задачу. Однако, совершенно очевидно, что в случае с языком программирования Java компании Sun Microsystems задача оказалась решенной до того, как ее сформулировали.
Создатель Java Джеймс Гослинг считает, что генезис этой технологии можно проследить с начала 1991 года, когда для изучения перспектив на рынке бытовой электроники в компании Sun была создана небольшая группа инженеров. В то время сеть World Wide Web существовала только в проектах.

Потребители против инженеров

"Группе была поставлена задача создать распределенную систему, которую можно было бы в качестве современной программной технологии продавать производителям бытовой электроники," - вспоминает Гослинг.
Гослинг, которому сейчас 40 с небольшим лет, перешел в Sun в 1984 г. из исследовательского отдела IBM. Его первая работа - интересный технически, но не имевший коммерческого успеха оконный интерфейс NeWS. Он также написал GOSMACS - первую реализацию текстового редактора EMACS на языке С.
Эта деятельность в области бытовой электроники (которая потом стала называться проектом "Green") показала Гослингу и его коллегам, как важны для потребителя такие показатели, как надежность, стоимость, соответствие стандартам и простота. Если пользователи рабочих станций заинтересованы в большой мощности и терпимы к высоким ценам, необходимости длительного обучения и наличию различных ошибок, то рядовым потребителям нужны дешевые, относительно простые и надежные устройства.
Чтобы успешно конкурировать на рынке бытовой электроники, компании должны рассматривать процессоры как обычный товар, который в любой момент можно заменить более дешевым, а также обеспечивать обратную совместимость и соблюдать стандарты, установившиеся на устройства длительного пользования типа тостеров и телевизоров.

В начале был С++

Чтобы не связывать разработку с конкретной платформой, Гослинг начал с расширения компилятора С++. Со временем, однако, он понял, что один С++, как его ни расширяй, не сможет удовлетворить все потребности. Поэтому в середине 1991 года был задуман язык Oak. (Впоследствии при поиске торговой марки его название было заменено на Java). "В конце концов, язык - это средство, а не самоцель, - поясняет Гослинг. - Мы не собирались зацикливаться на С++, а хотели разработать систему, которая позволяла бы создавать большую распределенную разнородную сеть из бытовых электронных устройств, способных взаимодействовать между собой".
В конце 1992 года, предприняв, по выражению тогдашнего инженера проекта Патрика Нотона, "огромные усилия по доработке Oak и других компонентов", коллектив проекта "Green" выпустил "*7" - устройство типа PDA, названное Гослингом "ручным пультом дистанционного управления".
"За полтора года мы сделали столько же, сколько иные большие коллективы в Sun делали за три года, - с гордостью отмечает Нотон. - Операционную систему GreenOS, язык, инструментарий, пользовательский интерфейс, новую аппаратную платформу, три заказных микросхемы... и каждый этап был связан с риском, т.к. мы использовали совершенно новые технологии".
30-летний Нотон до прихода в команду Green возглавлял проект Sun по разработке пользовательской среды Open Window.
Малогабаритность устройства *7 выгодно подчеркивала компактность и эффективность кода, являвшегося ядром технологии. Этот продукт широко демонстрировался в Sun и произвел впечатление на таких важных персон, как Скотт Макнили и Билл Джой, однако его дальнейшая судьба оставалось неясной.

Конкурс на разработку

Пока коллектив работал над Oak и *7, два его члена - специалист по оборудованию и технологии Эд Фрэнк и специалист по планированию бизнеса Майк Шеридан - подготовили примерную деловую и технологическую программу, которой могла бы воспользоваться какая-либо сторонняя компания типа Dolby Labs, чтобы создать и лицензировать технологию, и поместила бы логотип Sun на бытовую электронику вместе со своим. Ко времени появления демонстрационной модели *7 были готовы несколько версий этой программы. Однако в начале 1993 года, когда в Sun анализировались возможности применения Java, коллектив проекта Green, преобразованный к этому моменту в компанию FirstPerson, узнал об объявленном компанией Time-Warner конкурсе на разработку операционной системы для телевизионных приставок и технологии "видео по запросу". "Это было то, что надо", - вспоминает Гослинг.
FirstPerson быстро переориентировалась на рынок ОС для телеприставок и сделала Time-Warner предложение. Однако оно было отвергнуто, по мнению Гослинга и Нотона, чисто по политическим соображениям, хотя ее технология была признана лучшей.
FirstPerson продолжала работать над телеприставками до начала 1994 года, когда ее коллектив пришел к выводу о бесперспективности этого рынка. "Было много совершенно необоснованной рекламы", - поясняет Гослинг. Ряд недавних событий показал, что и сейчас рынок интерактивного ТВ еще не сформировался.
Тогда Нотон сумел доказать необходимость сворачивания работ над телеприставками и концентрации усилий в области онлайновых служб, CD-ROM и платформ для настольных систем. FirstPerson была распущена, и около половины ее сотрудников ушло в компанию Sun Interactive, где они стали заниматься разработкой серверов цифровых видеоданных. Но некоторые из них по-прежнему пытались найти пути применения технологии Java в объединенных в сеть настольных системах.

Обращение к Web

К середине 1994 года сеть World Wide Web выглядела уже вполне солидно. "Мы поняли, что сможем создать действительно первоклассный браузер, - говорит Гослинг. - Это один из немногих компонентов архитектуры клиент-сервер, который мы могли бы наделить такими необходимыми ему качествами, как независимость от архитектуры, работа в реальном времени, надежность, безопасность, не имеющие такого значения для рабочих станций. Поэтому мы и разработали браузер".
К осени Нотон и его коллега по Sun Джонатан Пэйн закончили писать WebRunner - Web-браузер, написанный на языке Java. Эта первая реализация HotJava проявила Java-технологию в новом свете, и эта демонстрация произвела впечатление на директора подразделения SunLabs Берта Сазерленда и главного технолога Sun Эрика Шмидта.

Что все это значит

Гослинг считает браузер таким компонентом, который "создает рынок" для инструментальных средств, серверов и сред разработки. И во всех этих средствах язык Java играет ключевую роль. "До появления Java страница WWW фактически представляла собой листок бумаги. В появлением Java браузер задает структуру и резко расширяет возможности провайдеров содержания".
Гослинг полагает, что технология Java заставит людей переосмыслить роль вычислений клиент-сервер. "В стандартной модели вы имеете определенные базы данных, пишете пакеты клиентского ПО, взаимодействующего с ними, и создаете какой-то интерфейс". В рамках этой модели трудно создавать распределенные системы и осуществлять их модернизацию, особенно если их части имеют разное происхождение, указывает Гослинг.
Имея же такие инструментальные средства как Java и Web, вы получаете исходно организованную систему, подчеркивает он. "Если вы создаете на языке Java клиентскую часть приложения, то его запуск сводится просто к переходу на соответствующую страницу. Инсталляция тривиальна - просто поместите необходимое ПО на Web-сервер. И никаких проблем с переносом, поскольку имеется только одна версия приложения". Многие компании, по словам Гослинга, уже организуют базы данных в виде Web-страниц с использованием интерфейса Common Gateway Interface (CGI) - специфического стандарта для работы внешних программ на сервере HTTP.

Этапы развития языка Java

История разработки языка Java, изложенная Патриком Нотоном, соавтором браузера HotJava и нынешним вице-президентом по технологии корпорации Starwave.
5 декабря 1990 г. - Нотон отказывается от предложения перейти в компанию NeXT и начинает работу в компании Sun над проектом, получившим впоследствии название Green.
15 января 1991 г. - Совещание типа мозгового штурма по проекту Stealth (названном так Скоттом Макнили) в Аспене, в котором участвовали Билл Джой, Энди Бехтолсхейм, Уэйн Розинг, Майк Шеридан, Джейм Гослинг и Патрик Нотон.
1 февраля 1991 г. - Гослинг, Шеридан и Нотон всерьез берутся за работу. Нотон занимается графической системой Aspen, Гослинг - идеями языка программирования, Шеридан - бизнес-разработкой.
8 апреля 1991 г. - Переезд по новому адресу и разрыв прямого соединения с локальной сетью (и большинством других средств связи) компании Sun; проект продолжается под названием Green.
15 апреля 1991 г. - К проекту Green присоединяются Эд Фрэнк (архитектор системы SPARCstation 10), Крейг Форрест (дизайнер чипа SS10) и Крис Уорт (разработчик системы NeWS).
Май 1991 г. - Эд Фрэнк присваивает прототипу аппаратуры название *7 (или Star7; *7 - код, который было необходимо набрать в офисе Sand Hill, чтобы ответить на любой звонок с любого телефона).
Июнь 1991 г. - Гослинг начинает работу над интерпретатором Oak, который через несколько лет (при поисках торговой марки) переименован в Java.
1 августа 1991 г. - Осуществлено объединение Oak и Aspen; заработала их первая реальная программа.
19 августа 1991 г. - Коллектив разработчиков Green демонстрирует идеи базового пользовательского интерфейса и графическую систему сооснователям компании Sun Скотту Макнили и Биллу Джою.
17 октября 1991 г. - Шеридан и Нотон присваивают конструкторской философии своего коллектива девиз "1st Person", который со временем становится названием компании.
17 ноября 1991 г. - Офис проекта Green снова подключается к главной сети компании Sun линией на 56 Кбит/с
1 марта 1992 г. - К проекту Green присоединяется Джонатан Пейн, который позднее участвует в написании HotJava.
Лето 1992 г. - Интенсивная деятельность по доработке Oak, Green OS, пользовательского интерфейса, аппаратуры Star7 и соответствующих компонентов.
4 сентября 1992 г. - Завершена разработка устройства Star7; оно продемонстрировано Джою и Макнили.
1 октября 1992 г. - Из компании SunLabs переходит Уэйн Розинг, принимающий на себя руководство коллективом.
1 ноября 1992 г. - Организована корпорация FirstPerson.
15 января 1993 г. - Коллектив переезжает в Пало Альто в здание, где раньше находилась лаборатория Western Research Lab компании DEC и была основана исходная группа Hamilton Group (она же OSF).
15 марта 1993 г. - После ознакомления с результатами испытаний кабельного интерактивного телевидения, проведенных компанией Time Warner, корпорация FirstPerson сосредотачивается на этой тематике.
Апрель 1993 г. - Выпуск первого графического браузера для Internet - Mosaic 1.0, разработанного в центре NCSA.
14 июня 1993 г. - Компания Time Warner продолжает проводить свои испытания интерактивного кабельного ТВ с компанией SGI, несмотря на признанное превосходство технологии компании Sun и уверения, что Sun выиграла эту сделку.
Лето 1993 г. - Нотон пролетает 300 тыс. миль, продавая Oak всем, занимающимся бытовой электроникой и интерактивным телевидением; тем временем темп, с которой люди получают доступ к Internet, головокружительно нарастает.
Август 1993 г. - Через несколько месяцев многообещающих переговоров с компанией 3DO относительно разработки ОС для приставок, президент 3DO Трип Хокинс предлагает купить технологию. Макнили отказывается, и сделка срывается.
Сентябрь 1993 г. - К коллективу присоединяется Артур Ван Хофф, поначалу - чтобы создать среду разработки приложений, предназначенных для интерактивного телевидения, а потом разрабатывающий, главным образом, сам язык.
7 декабря 1993 г. - Экспертиза операций на высоком уровне в FirstPerson обнаруживает, что эта группа не имеет реальных партнеров или маркетинговой стратегии и неясно представляет себе дату выпуска.
8 февраля 1994 г. - Отменено публичное заявление компании FirstPerson о выпуске, которое должно было состояться на конференции Technology, Entertainment and Design (TED).
17 февраля 1994 г. - Исполнительным лицам компании Sun для разносторонней экспертизы представлен альтернативный бизнес-план корпорации FirstPerson по разработке мультимедийной платформы для CD-ROM и онлайновой работы.
25 апреля 1994 г. - Создана компания Sun Interactive; в нее переходит половина сотрудников FirstPerson.
Июнь 1994 г. - Начат проект Liveoak, нацеленный Биллом Джоем на использование Oak в крупном проекте небольшой операционной системы.
Июль 1994 г. - Нотон ограничивает область применения проекта Liveoak, просто переориентировав Oak на Internet.
16 сентября 1994 г. - Пейн и Нотон начинают писать WebRunner - браузер типа Mosaic, позднее переименованный в HotJava.
29 сентября 1994 г. - Прототип HotJava впервые продемонстрирован исполнительным лицам компании Sun.
11 октября 1994 г. - Нотон уходит в компанию Starwave.
Осень 1994 г. - Ван Хофф реализует компилятор Java на языке Java. (Ранее Гослинг реализовывал его на языке С).
23 мая 1995 г. - Компания Sun официально представляет Java и HotJava на выставке SunWorld '95.

Что такое JAVA

Java - открытый объектно-ориентированный язык программирования, создавался для преодоления сложностей, связанных с написанием и компилированием программного обеспечения для различных операционных систем и различных устройств.
Java переводится как "кофе". Почему же так назвали серьёзный язык программирования? Да просто потому что программисты-разработчики очень любили кофе!
Целью разработчиков было создать инструмент позволяющий писать код, который будет полностью переносимым (кроссплатформенным) и в то же время эффективным, стабильным и будет быстро выполняться.
Кроссплатформенность была достигнута за счёт создания виртуальной машина Java.
Java Virtual Machine или JVM - это программа, являющаяся прослойкой между операционной системой и Java программой.
В среде виртуальной машины выполняются коды Java программ. Реализованы версии JVM для всех существующих операционных систем.

Другие достижения разработчиков

  • Разработчики достигли значительного сокращения времени на создание сложных программ, благодаря читаемому и понятному коду, синткасис которого похож на C/C++.
  • Предотвращение несанкционированного выполнения вредоносного кода за счёт системы безопасности.
  • Добились элегантного решения таких сложных задач как многопоточность, сетевое взаимодействие, создание распределённых приложений, работа с потоками данных, предотвращение утечки памяти, перехватывание и обработка ошибок и исключений.
  • Была разработана технология апплетов - динамически загружаемых программ, которые работают в среде веб браузера и позволяют вносить интерактивность в веб страницы.
  • Разработана технология WEB-start, предоставляющая возможность запускать программу онлайн, кликом по ссылке на веб странице. При этом программа загружается, кэшируется и запускается, не требуется процесс установки и обновления подобного программного обеспечения, также достигается кроссплатформенность.

Разделение платформы на три составляющие

  • Java Standard Edition (Java SE) - кроме JVM, предоставляет набор библиотек для создания десктоп приложений, как консольных, так и оконных с продвинутым пользовательским интерфейсом.
  • Java Enterprise Edition (Java EE) - надстройка над Java SE, предоставляет набор библиотек для создания web приложений, от обычных сайтов, до сложнейших корпоративных веб приложений.
  • Java Micro Edition (Java ME) - вариант виртуальной машины, оптимизированной для работы на портативных устройствах - карманных компьютерах и мобильных телефонах.
В настоящее время платформа Java EE является лучшей основой для создания корпоративных (enterprise) приложений.

Что предлагает нам установка Java платформы

  • Java Runtime - среда выполнения, обеспечивается виртуальной машиной.
  • Инструменты для разработки - компилятор, отладчик, инструмент для создания документации.
  • API - Application Programming Interface, обширный набор готовых библиотек для решения типичных и нетипичных задач.

Как работают Java программы

  • Программист создаёт файл с расширением JAVA и помещает в него исходный код программы.
  • С помощью компилятора на основании исходного кода создаётся файл с расширением CLASS, в него компилятор помещает байтовый код программы - команды для виртуальной машины.
  • При запуске программы загружается и выполняется файл с байт-кодом.

C# запись в файл

В этих примерах показаны различные способы записи текста в файл. В следующих двух примерах используются статические методы на классе System.IO.File для записи в текстовый файл либо полного массива строк, либо полной строки. В примере 3 показано, как добавить текст в файл, если перед записью в файл необходимо обрабатывать отдельно каждую строку. В примерах 1-3 происходит перезапись всего существующего содержимого файла. В примере 4 показано, как добавить текст в существующий файл.

Пример

class WriteTextFile
{
    static void Main()
    {

        // These examples assume a "C:\Users\Public\TestFolder" folder on your machine.
        // You can modify the path if necessary.

        // Example #1: Write an array of strings to a file.
        // Create a string array that consists of three lines.
        string[] lines = { "First line", "Second line", "Third line" };
        // WriteAllLines creates a file, writes a collection of strings to the file,
        // and then closes the file.
        System.IO.File.WriteAllLines(@"C:\Users\Public\TestFolder\WriteLines.txt", lines);


        // Example #2: Write one string to a text file.
        string text = "A class is the most powerful data type in C#. Like a structure, " +
                       "a class defines the data and behavior of the data type. ";
        // WriteAllText creates a file, writes the specified string to the file,
        // and then closes the file.
        System.IO.File.WriteAllText(@"C:\Users\Public\TestFolder\WriteText.txt", text);

        // Example #3: Write only some strings in an array to a file.
        // The using statement automatically closes the stream and calls 
        // IDisposable.Dispose on the stream object.
        using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"C:\Users\Public\TestFolder\WriteLines2.txt"))
        {
            foreach (string line in lines)
            {
                // If the line doesn't contain the word 'Second', write the line to the file.
                if (!line.Contains("Second"))
                {
                    file.WriteLine(line);
                }
            }
        }

        // Example #4: Append new text to an existing file.
        // The using statement automatically closes the stream and calls 
        // IDisposable.Dispose on the stream object.
        using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"C:\Users\Public\TestFolder\WriteLines2.txt", true))
        {
            file.WriteLine("Fourth line");
        }
    }
}
 //Output (to WriteLines.txt):
 //   First line
 //   Second line
 //   Third line

 //Output (to WriteText.txt):
 //   A class is the most powerful data type in C#. Like a structure, a class defines the data and behavior of the data type.

 //Output to WriteLines2.txt after Example #3:
 //   First line
 //   Third line

 //Output to WriteLines2.txt after Example #4:
 //   First line
 //   Third line
 //   Fourth line


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

Компиляция кода

Скопируйте код в консольное приложение.
Замените "c:\testdir" на фактическое имя папки в компьютере или создайте папку с этим именем.

Отказоустойчивость

При следующих условиях возможно возникновение исключения:
  • Файл существует и является файлом только для чтения.
  • Имя пути имеет слишком большую длину.
  • Диск может быть переполнен.