Как отправить сообщение с 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.

Другие вопросы по тегам