#scala #websocket #akka
#scala #websocket #akka
Вопрос:
У меня есть клиент websocket, написанный на scala-akka, который использует сервер websocket. Этот сервер отправляет a ping
каждые 3 минуты и ожидает a pong
. Сообщения о фреймах Pong также могут быть отправлены без запроса.
Тем не менее, akka поддерживает автоматическое поддержание активности, но только когда соединение простаивает. Соединение никогда не простаивает, но я хочу отправить кадры pong на сервер, иначе соединение будет отключено.
Я пытался передать такой источник
val pong = Source.tick(0 minute, 1 minute, BinaryMessage.apply(ByteString.apply("0xA")))
//or like this
val pong = Source.tick(0 minute, 1 minute, TextMessage.apply("pong"))
но, похоже, они не работают, соединение прерывается через 3 минуты, точно так, как указано в документах.
val flow = Flow.fromSinkAndSourceCoupledMat(printSink, pong)(Keep.both)
val (upgradeResponse, closed) = Http().singleWebSocketRequest(webSocketRequest, flow)
Часть документов, в которой упоминается это:
The websocket server will send a ping frame every 3 minutes. If the websocket server does not receive a pong frame back from the connection within a 10 minute period, the connection will be disconnected. Unsolicited pong frames are allowed.
Есть предложения?
Комментарии:
1. Akka HTTP всегда автоматически отвечает на PING-фреймы с помощью PONG-фреймов. Приведенные вами биты документации касаются того, следует ли отправлять pings (или незапрошенные pong) в дополнение к тому, что, как вы говорите, может происходить только при бездействии соединения. Так что, может быть, здесь играет роль что-то еще?