LINUX.ORG.RU

Flutter websocket + spring. WebSocketChannelException: [object Event]

 , , ,


0

1

Уже второй день не могу сделать так, чтобы в моё мобильное приложение на flutter приходили сообщения через websocket.

Как я понял, я использую StompClien для работы с Websocket message broker

Из логов только одна ошибка: WebSocketChannelException: [object Event]

В интернете нигде не смог найти информации ни по этой ошибке ни по тому как всё таки работать с вебсокетами на flutter.

Буду безмерно благодарен любой помощи!

Конфиг из spring:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {


    @Override
    public void configureMessageBroker(final MessageBrokerRegistry registry) {
        registry.enableSimpleBroker("/topic");
        registry.setApplicationDestinationPrefixes("/ws");
    }

    @Override
    public void registerStompEndpoints(final StompEndpointRegistry registry) {
        registry.addEndpoint("/our-websocket").withSockJS(); 
    }
}

Код flutter:

StreamController<List<String>> streamController = StreamController();
String ws_url = "ws://localhost:8080/our-websocket/websocket";
String destination = "/topic/messages";
String message_destination = "/ws/message";
var _listMessage = <String>[];

void main() {
  runApp(MaterialApp(
    debugShowCheckedModeBanner: false,
    home: MyApp(),
  ));
}

void onConnect(StompFrame frame) {
  stompClient.subscribe(
    destination: destination,
    callback: (frame) {
      Map<String, dynamic> result = json.decode(frame.body!);
      //receive Message from topic
      _listMessage.add(result['content']);

      //Observe list message
      streamController.sink.add(_listMessage);
    },
  );
}

final stompClient = StompClient(
  config: StompConfig(
    url: ws_url,
    onConnect: onConnect,
    onWebSocketError: (dynamic error) => print(error.toString()),
  ),
);

...(отрисовка приложения)

Вебсокет на спринге работает если в качестве фронтенда использовать веб приложение. Js отлично выполняет то что я хочу чтобы он выполнял.

Перемещено Dimez из general


Ответ на: комментарий от compasses

В google-chrome. Думаю проблема не с сетью.

Если сделать что-то такое https://docs.flutter.dev/cookbook/networking/web-sockets то всё работает.

Но изначально проблема в том, что мне нужно сделать свой сервер для работы с flutter.

Вот и получается, что сервер работает правильно. Мобилка работает правильно, а при попытке соеденить их ничего не выходит…

mayar
() автор топика
Последнее исправление: mayar (всего исправлений: 1)
Ответ на: комментарий от mayar

Свой websocket сервер это не проблема в dart. Единственный вопрос - вы хотите udp или tcp? Попробуйте на стороне сервера такой вариант для tcp общения:

import 'dart:io';
import 'dart:convert';
void main() {
  TCPServer();
}

void TCPServer() async{
  ServerSocket serverSocket = await ServerSocket.bind(InternetAddress.loopbackIPv4, 8088);
 
  await for(Socket socket in serverSocket) {
   
    socket.cast<List<int>>().transform(utf8.decoder).listen((input) {
      print("It's from client ${socket.remoteAddress.address}:" + input);
      socket.add(utf8.encode('It's from Server!'));
    });
  }
}

И еще вопрос - почему для общения с сервером вы не используете https://pub.dev/packages/web_socket_channel который работает отлично?

compasses
()
Последнее исправление: compasses (всего исправлений: 2)
Ответ на: комментарий от compasses

Огромное спасибо за ответ! Я попробую разобраться в этом.

Только в этом коде я не вижу как происходит механизм подписки на определённый брокер сообщений. Или он тут не нужен? Вообще моя цель состоит в том, чтобы сделать чат…

Единственный вопрос - вы хотите udp или tcp

Я не знаю разницы и не очень понял даже вопрос из-за неосведомлённости. Я прочитаю про это позже. Пока я хочу так как будет проще.

И еще вопрос - почему для общения с сервером вы не используете https://pub.dev/packages/web_socket_channel который работает отлично?

Я совсем недавно начал изучить flutter поэтому даже не знаю за что хвататься. Я не знаю почему я это не использую) Видимо мне не попался нужный гайд. Попробую разобраться в этом.

mayar
() автор топика
Ответ на: комментарий от compasses

Да и ещё…

Попробуйте на стороне сервера такой вариант для tcp общения:

Получается это код сервера?

Вообще хотелось бы сделать сервер на спринг…

mayar
() автор топика
Ответ на: комментарий от mayar

Да, это код сервера Вот пример клиента который будет с ним общаться:

import 'dart:convert';
import 'dart:io';
void main() {
  
  Socket.connect('127.0.0.1', 8088).then((socket) {
    socket.write('Hello from Client!');
    socket.cast<List<int>>().transform(utf8.decoder).listen(print);
  });
}

Запускать что клиент что сервер можно так:

dart server.dart
dart client cart

Есть отличный пример для работы со сторонним вебсокет-сервером на примере игры: https://github.com/ericdallo/grube

compasses
()
Ответ на: комментарий от compasses

Хорошо, спасибо! Возможно я попробую сделать сервер на dart

mayar
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.