2017-02-15 23 views
1

Я пытаюсь передать объект ws дочернему процессу.NodeJS передаёт объект ws дочернему процессу

В документации узла к дочерним процессам (https://nodejs.org/api/child_process.html) под функцией «отправить» говорится, что вторым параметром может быть объект TCP, с которым может делиться родительский дочерний элемент &.

Когда я пытаюсь передать объект ws, он говорит «throw new TypeError (« Этот тип дескриптора не может быть отправлен »);». Я предполагаю, что это потому, что это объект ws, а не объект tcp, но мне было интересно, есть ли способ добиться такого же эффекта с помощью объекта ws вместо объекта tcp ...? Поскольку ws - всего лишь оболочка вокруг объекта tcp, которая соответствует стандарту websocket.

ответ

5

К сожалению, сокет WS не является сырым объектом TCP. Сокеты TCP представляют собой конструкции уровня 4 и могут передаваться между процессами как сырые дескрипторы (в основном целые числа, в большинстве базовых метафоров ОС). Сама операционная система обрабатывает все TCP-операции, такие как управление состоянием сеанса, и это важно, когда процессы хотите передать ручки.

Веб-сайты совершенно разные. Это метафорическая конструкция поверх соединения уровня 7 (HTTP). В слоях 5+ приложения сами по себе довольно много коммуникаций, помимо того, что предоставляет операционная система, - с заголовками, куки, состояниями WS-соединения и т. Д. Это больше, чем может быть закодировано в целочисленном дескрипторе, поэтому Node в настоящее время есть способ их обойти.

Как правило, большинство приложений, которым требуются соединения, которые должны быть переданы таким образом, принимают TCP-соединение на необработанном уровне, передают это дочернему элементу, а затем разрешают дочернему пользователю обрабатывать HTTP (и WS). Они не разделяют эту работу между основным и дочерним процессом. Извините, это не тот ответ, который вам нужен, но ваша архитектура приложения нуждается в переосмыслении, если вы построили вокруг этого ожидания. Между прочим, это не только Узел. Это применимо и к любому другому языку, например Python или Ruby, потому что все они представляют собой только высокоуровневые оболочки вокруг конструкций Berkeley Sockets, а сокет, проходящий в этом слое, основан на ручках, как описано выше.

+0

Я вижу. То же самое относится и к классу кластера? (Https://nodejs.org/api/cluster.html). Может ли использоваться с этим, или он должен быть необработанным объектом http/tcp? – user1157885

+0

Да. Класс Cluster - это просто синтаксический сахар вокруг самого child_process. Он предоставляет ряд полезных компонентов для запуска и прекращения работы детей, поддержания заданного числа работников и предоставления возможности детям и родителям разговаривать друг с другом. Но он не добавляет ничего лишнего, чтобы можно было перемещать WS-соединения. –