Проблемы реализации веб-сокетов (Spring backend / React frontend) - PullRequest
0 голосов
/ 16 ноября 2018

Я пытаюсь создать веб-приложение в реальном времени (виртуальная многопользовательская настольная игра).Я начал с запросов HTTP, но сейчас пытаюсь переключиться на веб-сокеты.Я использую фронтенд React и бэкэнд Spring Boot.Теперь я понимаю, что мне нужно создавать веб-сокеты, но у меня возникают проблемы с их реализацией.

Использование стандартных объектов веб-сокетов в реагировать нормально работало на тестовом сервере (echo.websocket.org), но большинство руководств в Интернете, похоже,предложить использовать конечные точки STOMP.Кажется, что я не могу использовать универсальный объект websocket, если я использовал конечные точки STOMP в моем бэкэнде.Учитывая, что данные, которые я хочу отправить, представляют собой небольшой массив (например, координаты игрока) для всех клиентов, подключенных к серверу, является ли STOMP правильным протоколом или я могу сделать это проще?

Часть реагирующего компонентаво внешнем интерфейсе.

import React from 'react';
import Stomp from 'stompjs';

componentDidMount() {

    const ws = ("ws://localhost:8080/player");
    var client = Stomp.client(ws);
    client.connect({}, function() {
        client.send("/location/update", {}, "coord: [3,2]");
    });
}

Соответствующий контроллер во внутреннем интерфейсе.

@Controller
public class playerController {

public Player b = new Player("a", 1, 1, 1);

@MessageMapping("/player/location/update")
@SendTo("/playerLocation")
public int[] validClick(String value) throws Exception {
    Thread.sleep(1000);

    JSONObject temp = new JSONObject(value);
    JSONArray val = temp.getJSONArray("coord");
    int[] coord = {val.getInt(0), val.getInt(1)};
    b.updateLocation(coord);

    int[] newCoord = b.getLocation();
    System.out.println(newCoord[0] + "," + newCoord[1]);
    return b.getLocation();
}

Файл конфигурации: WebsocketConfig.java

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
    config.enableSimpleBroker("/playerLocation");
    config.setApplicationDestinationPrefixes("/api");
}

@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
    registry.addEndpoint("/player").withSockJS();
}

Все компилируется нормально, но при взгляде наинструмент сетевого разработчика в браузере для веб-интерфейса, ошибка 404 не удалось подключиться.Кажется, это говорит о том, что проблема в бэкэнде, но я не уверен.Любой совет приветствуется.

1 Ответ

0 голосов
/ 19 ноября 2018

В итоге я решил проблему, форматирование наших веб-сокетов было на самом деле правильным.Проблема заключалась в том, что наша файловая структура была неправильной (поэтому файл webSocketConfig.java находился в неправильном пакете), а наш файл Pom.xml был неправильным.У нас были зависимости для веб-сокетов Spring, а не для веб-сокетов Spring Boot, и, аналогично, при перестройке файловой структуры мы допускали ошибки в компоновках пакетов.

Мой совет всем, кто сталкивается с подобными проблемами: следуйте учебному пособию , напримерэто независимо , чтобы получить представление о правильной структуре файла и пакета, а затем попытаться адаптировать настройки для соответствия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...