Как отправить сообщение с WebSocket на сервер Socket.io
Я разрабатываю приложение React Native и хочу использовать класс WebSocket для связи с моим сервером Socket.io.
Я могу подключиться к серверу просто отлично, но у меня возникают проблемы с отправкой сообщений на него с помощью .send()
метод.
Я попробовал это на React Native:
var socket = new WebSocket("ws://host:port/socket.io/?transport=websocket");
socket.onopen = () => {
console.log("connected");
socket.send('data');
};
На моем сервере Socket.io у меня есть этот слушатель, который я создал только для тестирования:
socket.on('data', function(data) {
console.log("data");
})
Соединение работает, и я могу видеть это и на сервере. Но, когда я делаю socket.send('data')
disconnect
событие вызывается на сервере, а не data
Событие, которое я написал выше. (Я проверил это с помощью функции для вызова .send()
метод, так что это вызывает отключение на сервере)
Кто-нибудь может пролить свет на это?
2 ответа
Это связано с тем, что Socket.io не совсем совместим с WebSocket - существуют начальные рукопожатия, откаты соединения (например, когда WS недоступен, используется длинный пул AJAX или другой метод) и другие вещи, которые Socket.io скрывает от вас, чтобы сделать вашу жизнь Полегче. По сути, Socket.io следует рассматривать как отдельный протокол.
Чтобы подключиться к серверу Socket.io, вы должны использовать клиентскую библиотеку Socket.io.
ws.send(`42${ JSON.stringify(["message", { command: "register" }] }`), err => {
if (err) console.log("err", err);
});
Этот код использует ws pacakge в качестве примера.
Вам нужно добавить 42, чтобы сообщить серверу socoket.io, что вы отправляете сообщение, {command: "register"}
данные, которые вы отправляете, "message"
канал, который прослушивает socket.io
io.on("message", (data) => {
console.log(data); // => {command: "register"}
});
Объясните: это протокол engine.io, который использует socket.io. Проверьте это спец.
Лучшее решение - использовать socket.io с обеих сторон или вообще не использовать socket.io.