私はlocalhostのwebsocketを通していくつかのサーバに接続しようとしています。Akka-http:localhostのwebsocketに接続
ws = new WebSocket('ws://localhost:8137');
でJSでやろうとすると成功します。しかし、akka-httpとakka-streamsを使用すると、「接続に失敗しました」というエラーが表示されます。
object Transmitter {
implicit val system: ActorSystem = ActorSystem()
implicit val materializer: ActorMaterializer = ActorMaterializer()
import system.dispatcher
object Rec extends Actor {
override def receive: Receive = {
case TextMessage.Strict(msg) =>
Log.info("Recevied signal " + msg)
}
}
// val host = "ws://echo.websocket.org"
val host = "ws://localhost:8137"
val sink: Sink[Message, NotUsed] = Sink.actorRef[Message](system.actorOf(Props(Rec)), PoisonPill)
val source: Source[Message, NotUsed] = Source(List("test1", "test2") map (TextMessage(_)))
val flow: Flow[Message, Message, Future[WebSocketUpgradeResponse]] =
Http().webSocketClientFlow(WebSocketRequest(host))
val (upgradeResponse, closed) =
source
.viaMat(flow)(Keep.right) // keep the materialized Future[WebSocketUpgradeResponse]
.toMat(sink)(Keep.both) // also keep the Future[Done]
.run()
val connected: Future[Done.type] = upgradeResponse.flatMap { upgrade =>
if (upgrade.response.status == StatusCodes.SwitchingProtocols) {
Future.successful(Done)
} else {
Future.failed(new Exception(s"Connection failed: ${upgrade.response.status}")
}
}
def test(): Unit = {
connected.onComplete(Log.info)
}
}
ws://echo.websocket.orgで完全に問題なく動作します。
私はJavaScriptクライアントで動作し、問題は接続のみであるため、私のサーバーのコードを添付するのは無意味だと思いますが、それを見たい場合は表示してください。
私は間違っていますか?
ご協力いただきありがとうございます。それは私の質問に正確に答えなかったにもかかわらず、私はあなたのサーバーを起動すると、もう1つはまだ実行されていたことに気付きました。はい、正確なポートです。 1つは127.0.0.1で実行され、もう1つは:: 1で実行されたということでした。 – Ikciwor
あなたの例では、着信ストリームメッセージをそのように実現することはブロックされていませんか? – kyle