All
Итак, я изобрел составил простой протокол, который я хочу использовать для клиента, чтобы общаться с сервером. Это типичная (я думаю) трехфазная схема:
- Установление соединения (в конечном итоге будет включать согласование возможностей)
- Фактический обмен данными - пакеты счастливо перемещаются туда-сюда ', их интерпретирует соответствующий получатель, который действует на них соответственно
- Разрыв соединения - одна сторона говорит: «Не хочу больше», другая - «да будет так» (в конце концов, другая сторона будет отправлять данные до тех пор, пока это не будет сделано, вместо того, чтобы просто закрывать диалог)
Фреймворк представляет собой простую установку: сервер выполняет java.net.ServerSocket.accept () и запускает поток для обработки входящего соединения клиентом, который создает java.net.Socket () для хоста / порта. где сервер ждет. Обе стороны используют java.io.InputStream и java.io.OutputStream и разбрасывают данные друг на друга, собирая исходящие и анализируя входящие сообщения. Хорошо, пока.
Пока что протокол жестко запрограммирован. Установление соединения и разрушение в значительной степени хорошо, в то время как часть обмена данными - которую я хочу быть полнодуплексной - в значительной степени беспорядок.
Итак, подумайте мне, давайте сделаем это хорошо и настроим конечный автомат, используя, к удивлению, шаблон дизайна с тем же именем. Я достаточно ясно понимаю, какими должны быть состояния для сервера и клиента, соответственно, и какие события должны произойти для перехода, и какие действия следует предпринять, когда переход произойдет. Это выглядит хорошо - на бумаге, то есть. На практике я наткнулся на пару вопросов, которые не могу решить на бумаге.
В частности, входы конечного автомата ... немного разнообразны. Как я мог иметь возможность записывать данные, читать данные и проверять соединение (оно могло быть разорвано или может быть разорвано) одновременно? Кроме того, на 1-м и 3-м этапах должны быть установлены таймеры, чтобы избежать потенциально бесконечного времени ожидания ответов.
Итак, я был бы благодарен за любую помощь, которая ликвидирует мой разрыв между конечным автоматом теории и конечным автоматом кода.
Кстати, я тоже могу читать C / C ++ / C # - нет необходимости переводить на Java (именно это я и использую).