Общая архитектура для сетевого сервера / клиента, использующего конечный автомат - PullRequest
3 голосов
/ 19 ноября 2008

All

Итак, я изобрел составил простой протокол, который я хочу использовать для клиента, чтобы общаться с сервером. Это типичная (я думаю) трехфазная схема:

  • Установление соединения (в конечном итоге будет включать согласование возможностей)
  • Фактический обмен данными - пакеты счастливо перемещаются туда-сюда ', их интерпретирует соответствующий получатель, который действует на них соответственно
  • Разрыв соединения - одна сторона говорит: «Не хочу больше», другая - «да будет так» (в конце концов, другая сторона будет отправлять данные до тех пор, пока это не будет сделано, вместо того, чтобы просто закрывать диалог)

Фреймворк представляет собой простую установку: сервер выполняет java.net.ServerSocket.accept () и запускает поток для обработки входящего соединения клиентом, который создает java.net.Socket () для хоста / порта. где сервер ждет. Обе стороны используют java.io.InputStream и java.io.OutputStream и разбрасывают данные друг на друга, собирая исходящие и анализируя входящие сообщения. Хорошо, пока.

Пока что протокол жестко запрограммирован. Установление соединения и разрушение в значительной степени хорошо, в то время как часть обмена данными - которую я хочу быть полнодуплексной - в значительной степени беспорядок.

Итак, подумайте мне, давайте сделаем это хорошо и настроим конечный автомат, используя, к удивлению, шаблон дизайна с тем же именем. Я достаточно ясно понимаю, какими должны быть состояния для сервера и клиента, соответственно, и какие события должны произойти для перехода, и какие действия следует предпринять, когда переход произойдет. Это выглядит хорошо - на бумаге, то есть. На практике я наткнулся на пару вопросов, которые не могу решить на бумаге.

В частности, входы конечного автомата ... немного разнообразны. Как я мог иметь возможность записывать данные, читать данные и проверять соединение (оно могло быть разорвано или может быть разорвано) одновременно? Кроме того, на 1-м и 3-м этапах должны быть установлены таймеры, чтобы избежать потенциально бесконечного времени ожидания ответов.

Итак, я был бы благодарен за любую помощь, которая ликвидирует мой разрыв между конечным автоматом теории и конечным автоматом кода.

Кстати, я тоже могу читать C / C ++ / C # - нет необходимости переводить на Java (именно это я и использую).

1 Ответ

0 голосов
/ 19 ноября 2008

Состояние вашей машины должно быть сохранено в соответствии с «Соединением»

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

На самом деле я написал небольшую библиотеку, которая абстрагирует практически все от конечного автомата, если вам интересно. Там также есть тестовый код, который должен показать вам, как с ним работать. Код государственной машины

Он делает некоторые вещи, которые вы можете забыть, например, гарантировать, что переходы состояний, которые не являются «действительными», на самом деле являются ошибкой, а не могут быть пропущены, и регистрация изменений состояний бесплатна.

пс. (Любой) Если вы смотрите на это и вам не нравится - пожалуйста, дайте мне знать, почему. Я хотел бы сделать его пригодным для всех.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...