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 = ???
}
在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 = ???
}