Open m1kc opened 12 years ago
Итак, давайте подумаем. Какие задачи стоят перед протоколом XSP? Ну, самая общая задача - передавать информацию самого разного рода. Если более конкретно:
(13:39:32) Skynet: Блин. Мудрёно слишком. У меня другая идея. Она слегка отходит от изначальной, но зато достаточно простая и чем-то мне интересная. Сделать уровень выше над сокетом - канал. Плагины могу открывать каналы в том количестве, котором надо. Канал - это тоже I/O Stream, в который можно писать и читать, вроде, непрерывно. Но! Когда ты пишешь в такой канал, то оно потом собирается в пакет (по вызову flush) уходит по проводу. Приходит и лезет в InputStream, с которого можно читать как быдто просто из сокета. То есть модель такая, что каналов много, а сокет один. И мы реализуем простой протокол, который как нити толстой верёвки скручивает в один и передаёт по проводу, а на том конце распутывает.
У меня вот такая идея появилась. Допустим, у нас есть некий командный протокол. Пусть даже в XML, похуй. Есть протокол передачи файлов. Есть протокол передачи звука. И т.д. Далее. Любой модуль может в любой момент потребовать открытия сокета. Но! Этот сокет не будет связан с этим модулем. Проще говоря, любой модуль может в любой момент воспользоваться любым сокетом, если он не используется прямо сейчас кем-то ещё. Разумеется, это касается в основном командного сокета, вряд ли кто-то будет передавать звук в канале, открытом для файлов.
Но это сторона 1. Что же происходит на стороне 2? Сторона 2 вообще не в курсе, зачем открыт сокет. Потребовали — открыли. И эта сторона после открытия готова принимать оттуда любую информацию по любому из протоколов.
Что нам это даёт?
Собственно, это решает проблемы и с модульностью, и с откpытием сокетов, и с одновременной передачей файлов.
Переосмыслил предыдущую идею. Пусть у нас будет командный сокет и — остальные — трансляционные сокеты. Смысл трансляционного сокета в следующем: когда он открывается, я вызовом readUTF() получаю его тип; если тип мне незнаком, я просто закрываю сокет, если же знаком, то отдаю этот сокет тому модулю, за которым закреплён данный тип, и дальше по нему могут идти любые байты. Ну и, конечно, нужно иметь возможность ещё по командному протоколу проверить, смогу ли я обработать этот тип трансляции или нечего даже пытаться.
А не проще ли не перебирать сокеты, а открыть сокет и отправить нужный тип? Тогда удалённая сторона поймёт, что от ней хотели и ты сразу можешь этот сокет перебрасывать в нужный модуль.
Ну, а у меня как?
Ты не написал, кто передаёт тип, а кто его читает.
Передаёт открывающий, читает принимающий. Очевидно же.
Тогда да, это хорошая тема. Но кроме типа нужно ещё передавать версию плагина.
Ты предлагаешь плагину версии 15 помнить, что умеют и что не умеют предыдущие 14 версий?
Нет, если версия старше, то отклонять соединение или, по крайней мере, предупреждать.
А. Ну, можно и так.
Our protocol is not the best in the world. We must fix this as soon as possible.