2008-11-18 5 views
3

Все,Архитектура для сети клиента/сервера с помощью State Machine

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

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

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

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

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

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

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

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

ответ

0

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

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

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

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

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