Написано ранее:
Может быть, это конец периода, и различные дизайны курсов приходят один за другим. Недавно я увидел два вопроса и ответов на CSSDN, который должен написать программу чата на основе сокетов. Я недавно сделал что -то с Розеткой. Из -за интереса мне потребовалось несколько ночей свободного времени, чтобы выбить один. В настоящее время он поддерживает только отдельный чат, групповой чат и функции передачи файлов. Во -первых, я опубликовал уродливое изображение программы (пользовательский интерфейс написан на Java Swing, я забыл об этом в течение долгого времени, поэтому я не мог не прочитать JDK API, чтобы написать его), как показано ниже:
Дизайн сервера:
Сервер имеет две основные операции: одна - заблокировать сокет приемного клиента и выполнить обработку ответов, а другая - обнаружить сердцебиение клиента. Если клиент не отправляет сердцебиение в течение определенного периода времени, удалите клиента, создайте Serversocket, а затем запустите два пула потоков, чтобы справиться с этими двумя вещами (NewFixedThreadpool, NewschedThreadpool). Соответствующие классы обработки являются SocketDispatcher и SocketSchedule. SocketDispatcher распределяется по разным носкам в соответствии с различными запросами сокетов. SocketWrapper добавляет оболочку в розетку и записывает последнее время взаимодействия сокета, а Socketholder сохраняет коллекцию сокетов, которая в настоящее время взаимодействует с сервером. Дизайн заключается в следующем:
Дизайн клиента:
Дизайн клиента в основном делится на две части, а именно дизайн модуля связи с сокетами и дизайн, связанный с пользовательским интерфейсом
Дизайн связи клиентских сокетов на самом деле похож на конструкцию сервера. Разница в том, что сервер получает пакеты с сердцебиениями, в то время как клиент отправляет пакеты с сердцебиениями. Поскольку клиент общается только с одним сервером (связь между клиентами также распространяется сервером), для обработки этих двух вещей используется только пул потоков 2 (2). Соответствующие классы обработки получают и Keepalivedog. Когда полученная часть инициализируется, обратный вызов отправляется в качестве обратного вызова, что клиент получает сообщение сервера. Реализация обратного вызова по умолчанию - DefaultCallback. DefaultCallback распространяется на различные обработчики через HF в соответствии с различными событиями. Владелец клиента хранит текущую информацию клиента. Дизайн заключается в следующем:
Дизайн, связанный с пользовательским интерфейсом, я не планирую писать интерфейс самостоятельно. В конце концов, то, что я написал, слишком уродливо, поэтому я могу попросить моих одноклассников или друзей помочь мне потом подать его позже, поэтому я передаю обработку событий пользовательского интерфейса, чтобы справиться с ним, и просто отделяю дизайн пользовательского интерфейса и реакцию событий. Все интерфейсы наследуют JFrame и реализуйте интерфейс представления. Класс реализации обработчика выше получается через маршрутизатор (он будет возвращен непосредственно, если он будет существовать, и он будет создан и сохранен, если его не существует). Представление предоставляет пользовательский интерфейс Creation (), получить контейнер (), получить компоненты в пользовательском интерфейсе getComponent (), Display Display () и Recycle Trash (); ResultWrapper и Resultholder - просто для создания и хранения вкладок чата.
Общий дизайн модуля:
Общий модуль - это в основном взаимодействие данных, где данные JSON используются для взаимодействия. Общий модуль определяет различные типы информации о взаимодействии, передача информации о сокетах, реализованной SendHelper, I18N - это язык, а постоянная конфигурация - конфигурация и константы в системе (все константы - это интерфейсы, которые могут быть не очень хорошими). Для returnmessage он имеет серию DTOS в качестве атрибутов контента.
Запись программы:
Наконец, входная программа для сервера и клиента дана (полный код повешен на CSDN, и она будет обновляться непрерывно, если у вас будет время, и в конце будет адрес статьи)
Портал сервера:
Пакет yaolin.chat.server; импорт java.io.ioexception; import java.net.serversocket; import java.util.date; import java.util.concurrent.executorservice; import java.util.concurrent.executors; import.concurrent.schurentexececececurentexecurente.schurrentexecurente.schurrentexecurrent.shurrentexecurrent.schurrentexecr java.util.concurrent.timeUnit; import yaolin.chat.common.constantValue; импорт yaolin.chat.util.loggerutil;/*** Сервер* @author yaolin*/public class server {private serversocket server; Частный окончательный бассейн исполнителей; public server () бросает ioException {server = new Serversocket (constantValue.server_port); pool = executors.newfixedthreadpool (constantValue.max_pool_size); } public void start () {try {warededExeCutorService grade = executors.newschedledThreadpool (1); // Смотреть собаку. Исключение?? grade.scheduleatfixedrate (new socketschedule (), 10, constantvalue.time_out, timeunit.seconds); while (true) {pool.execute (new SocketDispatcher (server.accep ())); Loggerutil.info ("принять клиента в" + new Date ()); }} catch (ioException e) {pool.shutdown (); }} public static void main (string [] args) {try {new Server (). start (); } catch (ioException e) {loggerUtil.error ("Запуск сервера не удастся! ->" + e.getMessage (), e); }}} Клиентский портал:
Пакет yaolin.chat.client; импорт java.io.ioexception; import javax.swing.joptionpane; импорт yaolin.chat.client.callback.defaultcallback; import yaolin.chat.client.view.router; import yaolin.chat.client. yaolin * */public class niloaychat {public static void main (string [] args) {RegisterAndLoginView v = (RegisterAndLoginView) router.getView (RegisterAndLoginView.class) .create (); try {v.display (); Client Client = новый клиент (новый defaultCallback ()); client.start (); Clientholder.setClient (клиент); } catch (ioException e) {joptionPane.showmessageDialog (v.getContentPane (), e.getMessage ()); }}} Скачать исходный код: демонстрация
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.