Scala 中的非流式 WebSockets 是否可能?好像不像

Are non-stream WebSockets in Scala possible at all? Doesn't seem like it

在JavaScript和Python中,我在工作中经常使用的另外两种语言,设置WebSocket服务器(或客户端)和send/receive消息非常容易。

例如,查看从 the js WS repo 复制的代码。只需这段代码即可设置基于节点的 WebSocket 服务器:

const WebSocket = require('ws');

const wss = new WebSocket.Server({ port: 8080 });

wss.on('connection', function connection(ws) {
  ws.on('message', function incoming(message) {
    console.log('received: %s', message);
  });

  ws.send('something');
});

然后我可以获取那个 ws 连接对象并将其传递给某个工作人员,并在需要时发回消息。例如,我可以手动 ws.send("Batch 123 Complete"),并让我们的 UI 显示它。没问题。

在 Scala 中,无论我使用的是 http4s 还是 akka-http,这似乎都是不可能的。也许我太笨了,无法弄清楚(可能是!),但我花时间在 http4s gitter 上阅读了大量文档(fs2,开枪吧),唯一的 Scala WS 解决方案似乎基于流:你需要一个 fromClient 源,一个 toClient 源,连接它们,就是这样。您不能从服务器端手动执行相当于 ws.send('some info!') 的 Scala。

http4s gitter 中的一个非常善良的人甚至把 this example 放在一起试图帮助我解决我正在做的事情,但最终似乎没有。这在很大程度上是客户端请求 -> 服务器响应设置。它似乎不能随心所欲地向客户端发送消息。

我是不是完全漏掉了什么?我希望我有,因为我在工作中花了几天时间学习 http4s 套接字和 fs2,并提出了一个基于 fs2 调度程序的基于流的实现。当客户端打开与我的 WS 服务器的连接时,它会产生一个工作人员并每秒发送回状态消息,但我不喜欢它:/我的代码中需要可变变量。

任何提示或讨论将不胜感激。

我同意 HTTP4S 示例很疯狂!

必须是 HTTP4S 还是 Akka HTTP?您可以使用 Java-WebSocket 库轻松完成此操作:

val s = new WebSocketServer(address) {
  override def onOpen(webSocket: WebSocket,
                      clientHandshake: ClientHandshake): Unit = {
    // keep 'webSocket' around and push messages to it
  }

  override def onClose(webSocket: WebSocket,
                       code: Int,
                       reason: String,
                       remote: Boolean): Unit = 
    // remove the reference to 'webSocket'

  override def onMessage(webSocket: WebSocket, message: String): Unit =
    println("Received something from the client")

  override def onError(webSocket: WebSocket, e: Exception): Unit = ???

  override def onStart(): Unit = ???
}

https://github.com/TooTallNate/Java-WebSocket