Я начинаю работу с 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
Как упоминалось в моем комментарии:
Вы пробовали использовать обычный ws-протокол, а не безопасный (wss)? Он должен $websocket('ws://localhost:9000/socket')
следующим образом: $websocket('ws://localhost:9000/socket')
Вы определили обработку актера [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));
});
$websocket('ws://localhost:9000/socket')
. 2. Вы определили актера, обрабатывающего[String, String]
но на самом деле вы работаете с JSON в своей угловой части. Оба должны действительно совпадать, поэтому:WebSocket.acceptWithActor[JsValue, JsValue]