Объектно-ориентированное программирование Java «Чат»
Для того чтобы определиться с выбором какого-либо средства разработки нужно учитывать в первую очередь возможности вашей машины и наличие в ней достаточного количества ресурсов, иначе работа с некоторыми визуальными средствами превратится в сплошные мучения, т.к. большинство сред требуют наличия более менее современной конфигурации компьютера. Во-вторых, здесь также учитываются ваши личные… Читать ещё >
Объектно-ориентированное программирование Java «Чат» (реферат, курсовая, диплом, контрольная)
- Ведение
- 1. Описание среды разработки
- 1.1 Среда разработки
- 1.2 Cреда разработки Eclipse
- 1.3 Установка среды разработки Eclipse
- 1.4 Описание языка Java
- 2. Описание классов и методов
- 2.1 Описание пакетов использованных в программе
- 2.2 Описание программы сервера
- 2.3 Описание программы клиента
- 3. Руководство пользователя
- 3.1 Описание работы с программой сервера
- 3.2 Описание работы с программой клиента
- 3.3 Пример работы чата
- Заключение
- Cписок использованных источников
- Приложение
Java является основой практически для всех типов сетевых приложений и всеобщим стандартом для разработки и распространения встроенных и мобильных приложений, игр, веб-контента и корпоративного программного обеспечения. В мире насчитывается более 9 миллионов специалистов, разрабатывающих приложения на Java, которая позволяет эффективно разрабатывать, внедрять и использовать превосходные приложения и услуги.
От портативных компьютеров до центров сбора данных, от игровых консолей до суперкомпьютеров, используемых для научных разработок, от сотовых телефонов до сети Интернет — Java используется повсюду:
— Java используется на 97% корпоративных настольных ПК;
— Java используется на 89% настольных ПК в США;
— 9 млн разработчиков на Java в мире;
— Инструмент номер 1 среди разработчиков;
— Программа номер 1 среди разработчиков;
— Java используется в 3 млрд мобильных телефонов;
— Java входит в комплект поставки 100% всех проигрывателей дисков
Blu-ray;
— Используется 5 млн Java Card;
— Java используется в 125 млн ТВ-устройств;
— 5 из 5 основных производителей оригинального оборудования вклю;
чают в комплект поставки Java ME.
Технология Java протестирована, усовершенствована, расширена и проверена участниками сообщества разработчиков Java, архитекторов и энтузиас тов. Java позволяет разрабатывать высокопроизводительные портативные приложения практически на всех компьютерных платформах. Доступность приложений в разнородных средах позволяет компаниям предоставлять более широкий спектр услуг, способствует повышению производительности, уровня взаимодействия и совместной работы конечных пользователей и существенному снижению стоимости совместного владения корпоративными и потребительскими приложениями. Java стала незаменимым инструментом для разработчиков и открыла для них следующие возможности:
— написание программного обеспечения на одной платформе и его запуск практически на любой другой платформе;
— создание программ, работающих в веб-браузере и имеющих доступ к веб-службам;
— разработка приложений на стороне сервера для форумов в Интернете, магазинов, опросов, обработки форм HTML и много другого;
— объединение приложений или служб с использованием языка Java для создания высокоспециализированных приложений или служб;
— создание многофункциональных и эффективных приложений для мобильных телефонов, удаленных процессоров, микроконтроллеров, беспроводных модулей, датчиков, шлюзов, потребительских продуктов и практически любых других категорий электронных устройств.
1. Описание среды разработки
1.1 Среда разработки
Интегрированная среда разработки (Integrated Development Environment, IDE) — это совокупность программных средств, поддерживающая все этапы разработки программного обеспечения от написания исходного текста программы до ее компиляции и отладки, и обеспечивающая простое и быстрое взаимодействие с другими инструментальными средствами.
Для того чтобы определиться с выбором какого-либо средства разработки нужно учитывать в первую очередь возможности вашей машины и наличие в ней достаточного количества ресурсов, иначе работа с некоторыми визуальными средствами превратится в сплошные мучения, т.к. большинство сред требуют наличия более менее современной конфигурации компьютера. Во-вторых, здесь также учитываются ваши личные пристрастия и предпочтения. Некоторые сидят в обычных текстовых редакторах со стандартным JDK в консоли и не чувствуют необходимости что-либо менять.
Существуют среды разработки, предназначенные для нескольких языков, такие как Eclipse, NetBeans или Microsoft Visual Studio.
Выбор остановим на среде разработки Eclipse.
1.2 Cреда разработки Eclipse
Eclipse — один из лучших инструментов Java, созданных за последние годы. SDK Eclipse представляет собой интегрированную среду раз-работки (IDE, Integrated Development Environment) с открытым исходным кодом.
Основные инструментальные средства Eclipse Java включают в себя: редактор исходного кода (создание и редактирование исходного текста программ), средства отладки и интеграции с Ant. Кроме этого в Eclipse доступны множество бесплатных и коммерческих дополнений (плагинов), таких, как инструментальные средства создания схем UML, разработка баз данных и др.
Собственно сама по себе Eclipse — это только платформа, которая предоставляет возможность разрабатывать дополнения, называемые плагинами, которые естественным образом встраиваются в платформу. В Eclipse доступны дополнения для следующих языков: C/C++, Html, Cobol, Perl, Php, Ruby и др. Вы можете также разработать собственное дополнение для расширения возможностей Eclipse.
Eclipse разработана для широкого круга операционных систем, таких как Linux, Microsoft Windows и Mac OS. Для ее запуска требуется JVM (Java Virtual Machine) — виртуальная Java-машина, а также JDK (Java Development Kit) — набор для Java-разработки.
Таблица 1 — Минимальные и рекомендуемые системные требования.
Требования | Минимальное значение | Рекомендуемое значение | |
Версия Java | 1.4.0 | 1.6.0 и выше | |
Оперативная память | 128 Мб | 1 Гб и выше | |
Свободное пространсто на ЖД | 300 Мб | 1 ГБ и более | |
Процессор | 533 МГц | 1,5 ГГц и более | |
При первоначальном знакомстве со средой IDE Eclipse она может показаться несколько сложной для неподготовленного пользователя. Для того чтобы понять основы работы с системой, нужно уяснить себе основные концепции среды: рабочее пространство, инструменты, компоновки, редакторы и представления.
В простейшем случае рабочее пространство (workspace) — это каталог для проектов пользователя, в котором располагаются файлы проекта. Все, что находится внутри этого каталога, считается частью рабочего пространства.
Инструментальные средства Eclipse становятся доступны сразу после запуска приложения. Это по существу сама платформа с набором различных функциональных возможностей главного меню, где прежде всего выделяется набор операций по управлению проектом. Фактическая обработка, как правило, осуществляется дополнениями (плагинами), например редактирование и просмотр файлов проектов осуществляется JDT, и т. д.
К инструментам (workbench) относится набор соответствующих редакторов и представлений, размещенных в рабочей области Eclipse. Для конкретной задачи определенный набор редакторов и представлений называют перспективой или компоновкой.
Компоновка (perspective) — это набор представлений и редакторов, расположенных в том порядке, который вам требуется. В каждой компоновке присутствует свой набор инструментов, некоторые компоновки могут иметь общие наборы инструментов. В определенный момент времени активной может быть только одна компоновка. Переключение между различными компоновками осуществляется нажатием клавиш .
Используя компоновки, вы можете настроить свое рабочее пространство под определенный тип выполняемой задачи. В пособии будут использоваться компоновки, связанные в основном с программированием на Java, такие, как: Debug, Java Browsing, Java.
В Eclipse имеется также возможность создавать свои компоновки.
Открыть компоновку можно командой Window / Open Perspective.
Редакторы представляют собой программные средства, позволяющие осуществлять операции с файлами (создавать, открывать, редактировать, сохранять и др.).
Представления по существу являются дополнениями к редакторам, где выводится информация сопроводительного или дополнительного характера, как правило, о файле, находящемся в редакторе. Открыть представления можно командой Window / Show View.
Проект (project) представляет собой набор файлов приложения и сопутствующих дополнений. При работе с Java используются в основном файлы, имеющие следующие расширения: .java, .jsp, .xml.
Дополнением (plug-in) называют приложение, которое дополнительно может быть установлено в Eclipse. Примером дополнения может выступать JDT.
Мастер — это программное средство, которое помогает пользователю в настройках и проведении сложной операции. В Eclipse имеется множество различных мастеров, которые делают работу пользователя в системе удобной и эффективной, беря часть рутинных операций на себя. Примером мастера может выступить мастер создания нового класса, который помогает пользователю в таких операциях, как создание нового файла в нужной директории, создание начального кода класса, автоматическая расстановка модификаторов и т. д.
1.3 Установка среды разработки Eclipse
Во первых мы должны убедиться в том, что у нас установлена нужная версия библиотек поддержки Java. Ее можно найти на сайте eclipse.org.
После того как мы установили Java VM, мы устанавливаем JDK.
Поскольку Eclipse построен на Java, программное обеспечение требует для выполнения Java Development Kit (JDK) — бесплатно распространяемый компанией Oracle Corporation (ранее Sun Microsystems) комплект разработчика приложений на языке Java, включающий в себя компилятор Java (javac), стандартные библиотеки классов Java, примеры, документацию, различные утилиты и исполнительную систему Java (JRE). В состав JDK не входит интегрированная среда разработки на Java, поэтому разработчик, использующий только JDK, вынужден использовать внешний текстовый редактор и компилировать свои программы, используя утилиты командной строки.
Выбираем файл JDK в зависимости от вашей платформы (x86, x64) и устанавливаем его.
Рисунок 1 — Окно установки JDK
После установки нужно прописать пусть до файлов JDK в путях операционной системы. Это позволит нам запускать основные файлы из командной строки. Использована ОС Windows 7.0. В меню Пуск найдите пункт Компьютер и щелкните на нем правой кнопкой мыши. В появившемся меню выберите пункт Свойства. Выбираем пункт Дополнительные параметры системы. Получим окно, в котором надо выбрать пункт Переменные среды. В появившемся окне вам надо создать одну переменную — JAVA_HOME. И отредактировать переменную Path. Для этого нажимаем кнопку Создать.
Имя переменной: JAVA_HOME.
Значение переменной: C: eclipsJavajdk1.7.010.
Переменная Path уже обычно есть. Так что надо ее найти в списке и нажать кнопку Изменить. Но будьте внимательны — во-первых здесь надо вводить строку предварительно поставив; в конце списка всех путей. И во-вторых — надо добавить строку bin после (;C:eclipseJavajdk1.7.0_10bin).
Рисунок 2 — Окно изменения переменной Path
Теперь мы сделали все необходимые шаги для установки JDK.
Преступаем к установке Eclipse. Щелкните дважды на файле eclipse. exe, чтобы запустить Eclipse. Инсталляция будет завершена приглашением создать каталог рабочего пространства (workspace) — каталог рабочего пространства по умолчанию является подкаталогом в каталоге инсталляции, например, C: eclipseworkspace — появится Рабочее Место (Workbench).
Рисунок 3 — Окно запуска Eclipse
1.4 Описание языка Java
eclipse java программа чат Объектно-ориентированное программирование (ООП) это основная характеристика языка java. Фактически все jаvа-программы являются, по меньшей мере, частично, объектно-ориентированными. Язык java связан с ООП настолько тесно, что прежде чем приступать к написанию на нем даже простейших программ, следует вначале ознакомиться с базовыми принципами ООП:
— Инкапсуляция механизм, который связывает код и данные, которыми он манипулирует, защищая оба эти компонента от внешнего вмешательства и злоупотреблений. Один из возможных способов представления инкапсуляции представление в виде защитной оболочки, которая предохраняет код и данные от произвольного доступа со стороны другого кода, находящегося снаружи оболочки. Доступ к коду и данным, находящимся внутри оболочки, строго контролируются тщательно определенным интерфейсом.
— Наследование — процесс, посредством которого один объект получает свойства другого объекта. Это важно, поскольку он поддерживает концепцию иерархической классификации. Как уже отмечалось, большинство сведений становится доступным для понимания посредством иерархических (т.е. нисходящих) классификаций.
— Полиморфизм (от греческого слова, означающего «много форм») свойство, которое позволяет использовать один и тот же интерфейс для общего класса действий. Конкретное действие определяется конкретным характером ситуации.
Характерные особенности языка Java:
— простой. Синтаксис языка Java, по существу, представляет собой очищенный вариант синтаксиса языка C++. В этом языке нет заголовочных файлов, арифметики указателей (и самих указателей), структур, объединений, перегрузки операторов, виртуальных базовых классов и т. п.;
— объектно-ориентированный. Это метод программирования, в центре внимания которого находятся данные (т.е. объекты) и средства доступа к ним;
— распределенный. Java обладает большой библиотекой программ для передачи данных на основе таких протоколов TCP/IP (Transmission Control Protocol/Internet Protocol-протокол управления передачей/Интернет-протокол), как HTTP (Hypertext Transfer Protocol — протокол передачи гипертекстов) или FTP (File Transfer Protocol-протокол передачи файлов). Приложения, написанные на языке Java, могут открывать объекты и получать к ним доступ через сеть с помощью и URL-адресов (Uniform Resource Location — универсальный адрес ресурса) так же легко, как в локальной сети;
— надежный. Язык Java предназначен для создания программ, которые должны надежно работать в любых ситуациях. Основное внимание в языке Java уделяется раннему обнаружению возможных ошибок, динамической проверке (во время выполнения программы), а также исключению ситуаций, подверженных ошибкам. компилятор языка Java выявляет такие ошибки, которые в других языках обнаруживаются только на этапе выполнения программы;
— безопасный. Язык Java предназначен для использования в сетевой или распределенной среде. По этой причине большое внимание было уделено безопасности. Язык Java позволяет создавать системы, защищенные от вирусов и постороннего вмешательства;
— не зависящий от архитектуры. Компилятор генерирует объектный файл, формат которого не зависит от архитектуры компьютера, скомпилированная программа может выполняться на любых процессорах под управлением системы выполнения программ языка Java. Для этого компилятор языка Java генерирует команды, байт-кода, не зависящие от конкретной архитектуры компьютера;
— машинонезависимый. В отличие от языков С и C++, в спецификации Java нет аспектов, зависящих от системы реализации. И размер основных типов данных, и арифметические операции над ними точно определены;
— интерпретируемый. Интерпретатор языка Java может пересылаться на любую машину и выполнять байт-код непосредственно на ней. Поскольку редактирование связей — более легкий процесс, разработка программ может стать намного быстрее и эффективнее;
— высокопроизводительный. Хотя обычно интерпретируемые байт-коды имеют более чем достаточную производительность, бывают ситуации, в которых требуется еще более высокая эффективность. Байт-коды можно «на лету» (во время выполнения) транслировать в машинные коды для конкретного процессора, на котором выполняется данное приложение;
— многопоточный. Обеспечивает лучшую интерактивность и выполнение программы;
— динамичный. Во многих отношениях язык Java является более динамичным, чем языки С или C++. Он был разработан так, чтобы легко адаптироваться к постоянно изменяющейся среде. В библиотеки можно свободно добавлять новые методы и объекты, не причиняя никакого вреда. Язык Java позволяет легко получать информацию о ходе выполнения программы.
2. Описание классов и методов
2.1 Описание пакетов использованных в программе
Сокет — название программного интерфейса для обеспечения обмена данными между процессами. Процессы при таком обмене могут исполняться как на одной ЭВМ, так и на различных ЭВМ, связанных между собой сетью. Сокет — абстрактный объект, представляющий конечную точку соединения. Сокет — это комбинация IP-адреса и порта. Каждый процесс может создать слушающий сокет (серверный сокет) и привязать его к какому-нибудь порту операционной системы. Слушающий процесс обычно находится в цикле ожидания, то есть просыпается при появлении нового соединения. Для нас это означает, что сервер будет слушать какой-либо порт и после подключения клиента, будем производить с ним какие-то действия.
Пакет java.awt. содержит классы для написания пользовательских интерфейсов, работы с изображениями, рисования.
Abstract Window Toolkit (AWT) — это исходная платформонезависимая оконная библиотека графического интерфейса языка Java.
Пакет java.io. содержит фундаментальные классы, отвечающие за ввод и вывод данных. Поток данных (Stream (обмен данными с другими ресурсами)), InputStream (мы читаем из ресурса), OutputStream (мы пишем в ресурс). В нашем случае ресурсом является сокет.
Пакет java.net. содержит фундаментальные классы, отвечающие за работу с сетью. Socket (устанавливает TCP-соединения, передаёт и принимает данные), ServerSocket (слушает подключения от Socet’ов).
Пакет java.awt.event. обеспечивает интерфейсы и классы для того, чтобы иметь дело с различными типами событий, запущенных компонентами AWT.
Пакет javax.swing. содержит библиотека для создания графического интерфейса программ на языке Java. Он содержит ряд графических компонентов, таких как кнопки, поля ввода, таблицы и т. д.
2.2 Описание программы сервера
На сервере реализовано два потоковых класса (NetServerThread и Incoming). Первый принимает сообщения от всех подключённых клиентов и заносит их во временную переменную. Во втором классе происходит отправка сообщений, из временной переменой, клиентам, с некоторым интервалом (для того чтобы клиенты успевали считывать сообщения). По большому счёту, сервер является ретранслятором сообщений клиентов, и никак не вмешивается в их обработку.
Класс NetServerThread. Здесь мы создаём объект класса ServerSocket, который называется server и указываем ему порт для чтения 8030. Это значит, что мы будем работать именно с этим портом. После этого, для нашего объекта мы вызываем метод accept (). Этот метод заставляет программу ждать подключения от клиента по указанному порту. Для того, что бы программа не завершалась после успешного подключения клиента, мы заключаем её в цикл while (true). После успешного подключения информация о клиенте заносится в объект s класса Socket, после чего он передаётся во второй поток — класс Incoming.
Методы, реализованные в классе NetServerThread:
— getOutputStream () — для отправки информации клиенту;
— start () — для запуска созданных потоков;
— send (String msg) — отправляет сообщение на экран чата;
— flush () — освобождает данные из потока (делает его пустым).
— Thread. sleep (100) — заставляет спать сервер 100 миллисекунд (задаём задержку главному потоку).
Класс Incoming. Здесь мы считываем информацию поступившую от клиента и заносим во временную переменную.
Методы, реализованные в классе Incoming:
— getInputStream () — принимает сообщения от клиентов;
— readLine () — считывает строку введенного сообщения;
Класс InputStreamReader использован для декодирования входящий байтов в символы.
Класс BufferedReader читает текст от входного потока, буферизируя символы, чтобы предусмотреть эффективное чтение символов, массивов и строк.
2.3 Описание программы клиента
Клиент подключается к серверу и посылает серверу сообщение вида «@Имя_клиента». Получив такого вида сообщение, каждый из клиентов выведет сообщение о подключении пользователя с указанным именем. Пред отключением клиента от сервера, на сервер посылается сообщение вида «#Имя_клиента», получив которое, каждый из клиентов выведет сообщение об отключении пользователя с данным именем. После ввода отправляемого сообщения и нажатия кнопки «Отправить» сообщение передается на сервер, после чего возвращается и выводится в окне чата. В клиенте реализовано два потоковых класса. Один из которых отвечает за приём и отправку сообщений, а второй за интерфейс и обработку сообщений.
Класс NetClientThread. Здесь создаётся объект класса Socket, который называется s и указывается ему порт и IP для чтения (127.0.0.1, 8030) при помощи которого будет отправлятся на сервер информацию о подключении клиента.
Методы, реализованные в классе NetClientThread:
— getInputStream () — принимет информацию с сервера;
— getOutputStream () — отправляет информацию на сервер;
— start () — запускает потоки;
— send () — отправляет сообщения на сервер;
— flush () — освобождает данные из потока (делает его пустым);
— readLine () — считывает строку введенного сообщения.
Класс FieldWindow. Здесь создаётся графический интерфейс для нашего чата, а также форма для отправки сообщений на сервер и в окно чата.
Методы, реализованные в классе FieldWindow:
— setLayout () — выполняется установка менеджера компановки FlowLayout. В режиме FlowLayout компоненты добавляются в окно контейнера с применением очень простого алгоритма. Каждый новый добавленный компонент располагается вслед за предыдущим в направлении слева направо и сверху вниз, при этом выполняется центровка компонент по горизонтали;
— setBackground () — для настройки заливки фона;
— setFont () — для установки настроек шрифта;
— setPreferredSize () — для настройки размеров кнопки;
— setForeground () — для настройки цвета бордера кнопки;
— add () — добавить компонент во фрэйм;
— addActionListener () — вызываем слушателя actionPerformed () для выполнения команд при нажатии на кнопку;
— setSize () — для настройки размеров фрэйма;
— setLocation () — для настройки положения;
— setResizable () — для установки возможности изменения размер окна фрэйма пользователем;
— setVisible () — для настроек видимости окна фрэйма;
— setDefaultCloseOperation () — для закрытия окна на крестик;
— start () — для проверки ошибок соединения с сервером и пустоты сообщения, а также форма отправки сообщений на сервер и на экран чата.
— Thread. sleep (10) — говорит о том, что второстепенный поток спит 10 миллисекунд (меньше чем главный, что и правильно).
Класс Socket (s) — этот класс реализует клиентские сокеты. Сокет является конечной точкой для передачи между двумя машинами.
Класс TextField (str) представляет собой реализацию однострочной области для ввода текста. В чате служит областью для ввода сообщения.
Класса TextArea (chat) создаёт многострочное поле заданной ширины и высоты, снабженное полосами просмотра.
Класс Font (font) создаёт настройки шрифта сообщений в окне чата.
Класс Button (). Кнопка в чате служит для отправки сообщения собеседнику и выхода из чата.
Класс JFrame (wind1) использован для создания фрэйма.
Класс Color () использован для создания цвета.
Класс InputStreamReader использован для декодирования входящих байтов в символы.
Класс BufferedReader читает текст от входного потока, буферизируя символы, чтобы предусмотреть эффективное чтение символов, массивов и строк.
3. Руководство пользователя
3.1 Описание работы с программой сервера
Запускаем сервер программы. Двойным нажатием на файл «Server.jar» или из среды разработки Eclipse на кнопку «Run». После запуска программы и установления соединения, сервер готов к работе и будет ждать подключения клиента. Подключение будет проходить через порт 8030, который был задан при написании программы. В данной программе сервер является ретранслятором сообщений клиентов, и никак не вмешивается в их обработку.
3.2 Описание работы с программой клиента
Запускаем программу Клиента. Двойным нажатием на файл «Client.jar» или из среды разработки Eclipse на кнопку «Run». После запуска программы и установления соединения, программа клиента становится готовой к работе. Программа клиента запускается только после того как, запущен сервер.
Рисунок 4 — Окно клиента
В клиентской программе нет необходимости прописывать порт, так как он уже был задан при написании программы.
Для начала общения необходимо ввести передаваемое сообщение в строку слева от кнопки «отправить» (рисунок 5). После ввода необходимого сообщения нужно нажать на кнопку «отправить». После отправки сообщения оно отобразится в блоке чата (рисунок 6).
После завершения работы с программой достаточно просто закрыть её, нажатием на Х (крестик в правом верхнем углу) или на кнопку «Выход». Кнопка «Выход» расположена под строкой ввода сообщения.
3.3 Пример работы чата
Рисунок 5 — Пример работы чата
Рисунок 6 — Пример работы чата
В данном примере я продемонстрировал подключение и отключение нескольких пользователей к серверу. Обмен сообщениями между пользователями. Сообщения в чате выводятся под именем пользователя, который его написал.
Заключение
В результате выполненной работы были решены все задачи и достигнута цель. Целью данной работы было разработать сетевое приложение на языке Java «Чат» .
Чат был реализован с использованием среды Eclipse.
Использование средств Eclipse по созданию приложений работающих в различных операционных системах и в частности сетевых приложений, позволило создать чат ориентированный на пользователя.
Представленная версия приложения является законченным программным продуктом. Однако она может быть доработана, для чего понадобятся дополнительные средства, а также время, в течение которого будут исправляться все недочеты, которые пропустил или не посчитал нужным реализовывать разработчик.
Данный программный продукт рассчитан для обмена пользователей сообщениями.
Программа имеет удобный интерфейс, является многоплатформенной, и достаточно проста в применении.
Cписок использованных источников
1. https://www.java.com/ru/about/04.05.2014
2. http://www.sources.ru/java/faq/ide.htm04.05.2014
3. http://www.java-study.ru/java-uchebnik/2-vvedenie04.05.2014
4. http://window.edu.ru/resource/397/58 397/files/Eclipse_Java.pdf
5. Макейчик, Е. Г. Лабораторный практикум: Объектно-ориентированное программирование и программное моделирование функциональных узлов телекоммуникаций / Е. Г. Макейчик. — Минск.: 2013. — 76 с.
6. Герберт Шилдт — Полный справочник по Java SE6.
7. http://java-study.ru/java-uchebnik/2-vvedenie
Приложение А
Сервер
package pak_chat;
import java.net.*;
import java.io.*;
class Incoming extends Thread
{
Socket sock;
// читает текст от потока ввода символов, буферезируя их
BufferedReader in = null;
String soobsh = null;
Incoming (Socket s) // Создаём новый поток
{
sock = s;
try
{
// Считываем информацию поступившую от клиента
InputStreamReader isr = new InputStreamReader (sock.getInputStream ());
//Заносим информацию в буфер
in = new BufferedReader (isr);
} catch (IOException e) {
System.out.println («ошибка: «+ e);}
}
public void run () // Точка входа созданного потока
{
while (true)
{
try
{
// Выполняет чтение строки символов из
// текущего потока и возвращает данные в виде
// строки, которые заносятся в буфер
soobsh= in. readLine ();
if (soobsh≠null)
{
NetServerThread.Message = soobsh;
soobsh=null;
}
} catch (IOException e) {
break;}
}
}
}
public class NetServerThread extends Thread
{
String lastm;
Socket socket;
int i=0;
// класс для расширения потоков ввода вывода
PrintStream ps;
public static String Message=null;
public NetServerThread (Socket s)
{
lastm=null;
socket = s;
try
{
//класс, который занимается
//выводом информации
ps = new PrintStream (s.getOutputStream ());
} catch (IOException e) {
System.out.println («ошибка: «+ e);}
}
public static void main (String[] args)
{
try {
//читаем порт 8030
ServerSocket server = new ServerSocket (8030);
while (true)
{
Socket s = null;
//Ждём подключения клиента
s = server. accept ();
NetServerThread nst = new NetServerThread (s);
Incoming incom = new Incoming (s);
//Запускаем потоки
nst.start ();
incom.start ();
}
} catch (IOException e) {
System.out.println («ошибка: «+ e);
}
}
public void run ()
{
while (true)
{
if ((Message≠null)&&(lastm≠Message))
{
lastm=Message;
//отправляем сообщение на экран приложения
send (lastm);
}
try
{
//поток спит 100 миллисекунд
Thread.sleep (100);
} catch (InterruptedException e) {
System.out.println («ошибка: «+ e);
}
}
}
public void send (String msg)
{
ps.println (msg);
//очистили буфер объекта класса ps
ps.flush ();
}
}
Клиент
package pak_chat;
import java.net.*;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
//Создаём стандартное окно. Организуем слушателя
class FieldWindow extends JFrame implements ActionListener
{
private static final long serialVersionUID = 1L;
static TextArea chat = new TextArea (««, 25,65,TextArea.SCROLLBARS_VERTICAL_ONLY);
TextField str = new TextField (53);
Font font = new Font («Dialog», Font. BOLD, 12);
Button send = new Button («Отправить»);
Button ext = new Button («Выход»);
static String command = «» ;
static String incopy = null;
static String mess = null;
static String name = «Kurill=)))» ;
JFrame wind1 = new JFrame («Facebook»);
static int len, i=0,u=0;
Color lightskyblue = new Color (135, 206, 250);
Color lightsteelblue = new Color (176, 196, 222);
Color linen = new Color (250, 240, 230);
Color lightcyan = new Color (224, 255, 255);
FieldWindow ()
{
wind1.setLayout (new FlowLayout ());
chat.setBackground (lightcyan);
chat.setFont (font);
str.setBackground (lightcyan);
ext.setPreferredSize (new Dimension (476,20));
ext.setBackground (lightsteelblue);
ext.setForeground (linen);
send.setBackground (lightsteelblue);
send.setForeground (linen);
wind1.add (chat);
wind1.add (str);
wind1.add (send);
ext.addActionListener (this);
send.addActionListener (this);
wind1.add (ext);
wind1.setSize (500,500);
wind1.setLocation (120,60);
wind1.setResizable (false);
wind1.setVisible (true);
wind1.getContentPane ().setBackground (lightskyblue);
wind1.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
}
public void start ()
{
if (NetClientThread.Errors ≠ null)
{
chat.append (NetClientThread.Errors);
NetClientThread.Errors=null;
}
while (true)
{
if ((NetClientThread.Message≠null)&&(NetClientThread.Message≠""))
{
incopy=NetClientThread.Message;
NetClientThread.Message=null;
switch (incopy.charAt (0))
{
case '@':
len=incopy.length ()-1;
for (i=1;i<=len;i++)
{
command=command+incopy.charAt (i);
}
i=1;
chat.append («В чат вошел пользаватель: „+command+“ n»);
incopy=null;
command="" ;
break;
case '#':
len=incopy.length ()-1;
for (i=1;i<=len;i++)
{
command=command+incopy.charAt (i);
}
i=1;
chat.append («Из чата вышел пользаватель: „+command+“ n»);
incopy=null;
command="" ;
break;
default:
chat.append (incopy);
chat.append («n»);
}
}
try
{
//Поток спит 10 миллисекунд
Thread.sleep (10);
} catch (InterruptedException e) {
e.printStackTrace ();
}
}
}
//Обработка события при нажатии кнопоки
public void actionPerformed (ActionEvent e)
{
if (e.getSource ()==ext)
{
NetClientThread.send («#» +name);
NetClientThread.out.close ();
try
{
NetClientThread.in.close ();
} catch (IOException e2) {
e2.printStackTrace ();}
try
{
NetClientThread.s.close ();
} catch (IOException e1) {
e1.printStackTrace ();
}
System.exit (0);
}
if (e.getSource ()==send)
{
mess=str.getText ();
NetClientThread.send (mess);
str.setText (««);
}
}
}
public class NetClientThread extends Thread
{
static String Errors=null;
static String Message=null;
static BufferedReader in = null;
// Класс, который занимается выводом информации
static PrintWriter out;
static Socket s = null;
static String msg =null;
public NetClientThread ()
{
try
{
//подключаемся к серверу
s = new Socket («127.0.0.1», 8030);
// Считываем информацию поступившую с сервера
InputStreamReader isr = new InputStreamReader (s.getInputStream ());
// Заносим информацию в буфер
in = new BufferedReader (isr);
// отправляем информацию на сервер
out=new PrintWriter (s.getOutputStream (), true);
} catch (IOException e) {
Errors="Ошибка соединения" ;
}
}
public static void main (String[] args)
{
NetClientThread nct = new NetClientThread ();
//запускаем потоки
nct.start ();
FieldWindow newwindow=new FieldWindow ();
newwindow.start ();
}
public void run ()
{
send («@» +FieldWindow.name);
while (true)
{
try
{
Message = in. readLine ();
} catch (IOException e) {
break;
}
}
FieldWindow.chat.append («Ошибка соединения с сервером»);
}
public static void send (String msg)
{
out.println (msg);
out.flush ();
}
}