Play Websocket соединение закрыто

0

Я начинаю работу с webSockets, угловой и игры. Я использую https://github.com/AngularClass/angular-websocket для приятной угловой интеграции. Соединение как таковое:

var dataStream = $websocket('wss://echo.websocket.org/');

прекрасно работает. Однако пытаюсь подключиться к:

var dataStream = $websocket('wss://localhost:9000/socket');

Результаты в:

WebSocket connection to 'wss://localhost:9000/socket' failed: Error in connection establishment: net::ERR_CONNECTION_CLOSED

В журнале play/netty я нахожу только:

 play.core.server.netty.PlayDefaultUpstreamHandler - Exception caught in Netty
java.lang.IllegalArgumentException: empty text 

Это код, который я использую в бэкэнд:

def socket = WebSocket.acceptWithActor[String, String] { request => out =>
    MyWebSocketActor.props(out)
  }
object MyWebSocketActor {
  def props(out: ActorRef) = Props(new MyWebSocketActor(out))
}
class MyWebSocketActor(out: ActorRef) extends Actor {
  def receive = {
    case msg: String =>
      out ! ("I received your message: " + msg)
  }
}

(на основе: https://www.playframework.com/documentation/2.4.x/ScalaWebSockets)

Здесь мой код: https://github.com/dataplayground/playground/blob/master/public/javascripts/main.js

  • 0
    Я хотел бы прокомментировать две вещи: 1. Вы пытались использовать обычный протокол ws, а не безопасный (wss). Как этот $websocket('ws://localhost:9000/socket') . 2. Вы определили актера, обрабатывающего [String, String] но на самом деле вы работаете с JSON в своей угловой части. Оба должны действительно совпадать, поэтому: WebSocket.acceptWithActor[JsValue, JsValue]
  • 0
    супер. Спасибо, ваши баллы действительны! Это решение. Вы хотите написать решение?
Показать ещё 1 комментарий
Теги:
playframework
websocket
playframework-2.4

1 ответ

1
Лучший ответ

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

  1. Вы пробовали использовать обычный ws-протокол, а не безопасный (wss)? Он должен $websocket('ws://localhost:9000/socket') следующим образом: $websocket('ws://localhost:9000/socket')

  2. Вы определили обработку актера [String, String] но вы фактически работаете с JSON в своей угловой части. Оба должны совпадать, поэтому попробуйте: WebSocket.acceptWithActor[JsValue, JsValue]

Я не уверен, что вы возвращаете правильные данные JSON, а также об обработке на вашей угловой стороне.

Во- первых, если вы используете обратный слэш \ метод (https://www.playframework.com/documentation/2.3.x/api/scala/index.html#play.api.libs.json.JsValue) вы получаете JsValue, но это делает не обязательно представляют собой действительный JSON. Если у вас есть {"foo": "test"} и искать тогда вы получите "тест", но это на самом деле не является допустимым JSON.

Просто вы получите быструю обратную связь: попробуйте либо сменить актер Websocket на тип [JsValue, String] вы можете просто создать новый JsValue в своем актере:

class MyWebSocketActor(out: ActorRef) extends Actor {
  def receive = {
    case msg: JsValue =>
      Logger.debug("actor something  " + out)
      Logger.debug("message  " + Json.prettyPrint(msg))

      val json: JsValue = Json.parse("""
      {
          "fooReply" : "Something"
      }
      """)
      out ! json
  }
}

Редактировать:

Это происходит из ng-websocket, что вы должны получить свойство data а не напрямую message?

dataStream.onMessage(function (message) {
    collection.push(JSON.parse(message.data));
});
  • 0
    Это прямо из их учебника: github.com/AngularClass/angular-websocket
  • 0
    Хорошо, я вижу. Теперь он работает правильно с правильным объектом JsValue?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню