Почему невозможно передать WebSocket через сокет?

#serialization #websocket #dart

#сериализация #websocket #dart

Вопрос:

Как передать объект WebSocket через Websocket?

 ws.onOpen.listen((e) {
    outputMsg('Connected');
    WebSocket otherWebSocket = ...;
    ws.send(otherWebSocket); // does not work
  });
  

Комментарии:

1. «не работает» Что происходит вместо этого? Вероятно, веб-сокет не может быть сериализован и десериализован разумным способом.

2. Это просто невозможно. В какой-то момент WebSocket оборачивает собственный сокет ОС, и вы никак не можете осмысленно сериализовать сокет ОС.

3. Я так и думал. RTC не развивается. О соединениях между браузерами можно пока забыть о p2p…

4. Можете ли вы отправить факс по факсу? Можете ли вы отправить сообщение по телефонному звонку?

5. Зачем вам это делать?

Ответ №1:

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

Хитрость заключается в написании класса, который бы обертывал WebSocket и имел метод, вызываемый для сериализации. Конструктору класса потребуется сохранить параметры конструктора.

Затем метод сериализации может сериализовать эти параметры конструктора и любые другие существующие данные «состояния» (например, байты, еще не прочитанные из веб-сокета, любые данные, относящиеся к разговору с сервером, такие как ключи, идентификатор клиента и т.д.) и закрыть WebSocket.

Получатель сможет создать новый WebSocket на основе этих параметров и возобновить взаимодействие с сервером на основе этих данных состояния.

Очевидно, что это потребовало бы, чтобы сервер на другом конце сокета сотрудничал в закрытии и повторном открытии сокета и продолжал, как будто ничего не произошло. Если сервер не собирается этого делать, то этот метод не будет работать.

Код Python, на который я ссылаюсь, касается того, как сериализовать файловый дескриптор. Все, что он делает, это сериализует путь и имя файла, текущую позицию файла, режим чтения / записи и т.д. Это позволяет получателю сериализованного файла повторно открыть файл в точно таком же состоянии, в каком он был ранее.