Событие
close
будет вызвано после того, как соединение с сокетом TCP будет закрыто тем или иным концом, за исключением нескольких случаев, когда система «не осознает», что сокет уже закрыт, но это редкие случаи.Поскольку WebSockets запускаются с HTTP-сервера запросов, он может просто поддерживать работу до истечения времени ожидания сокета.Это включает в себя задержку.
В вашем случае вы пытаетесь выполнить рукопожатие , а затем отправлять данные туда и обратно, но WebSockets - более сложный процесс, чем этот.
Рукопожатиепроцессу требуется некоторая процедура security для проверки обоих концов (сервера и клиента), и это HTTP-совместимые заголовки.Но разные черновые версии, поддерживаемые разными платформами и браузерами, реализуют это по-разному, поэтому ваша реализация должна учитывать это и следовать официальной документации по спецификации WebSockets на основе версий, которые вы должны поддерживать.
Затем отправкаи получение данных через WebSockets не является чистой строкой.Фактические данные, отправляемые по протоколу WebSockets, имеют слой формирования данных , который включает добавление заголовка к каждому отправляемому сообщению.Этот заголовок содержит подробную информацию о отправляемом сообщении, маскировке (от клиента к серверу), длине и многом другом.формирование данных снова зависит от версии WebSockets, поэтому реализации будут незначительно отличаться.
Я бы рекомендовал бы использовать существующие библиотеки , так как они уже реализуют все, что вам нужно, в хорошем и чистом виде, и имеютШироко использовался в коммерческих проектах.
Поскольку ваш клиент является встроенной платформой, а сервер, как я полагаю, тоже является node.js, легко использовать одну и ту же библиотеку на обоих концах.
Лучшим вариантом здесь будет ws - фактический pure WebSockets .
Socket.IO не подходит для вашего случая, так как это гораздо более сложная и тяжелая библиотека с несколькими спискамипротоколов поддерживают с помощью откатов и имеют некоторую абстракцию, которая может быть не тем, что вы ищете.