我正在为我的Web服务器使用nim programming language的prologue framework,并希望使用websocket。
在prologue docs中有一节是关于websocket的,但它主要告诉我如何设置用于建立websocket的处理程序:
import prologue
import prologue/websocket
proc hello*(ctx: Context) {.async.} =
var ws = await newWebSocket(ctx)
await ws.send("Welcome to simple echo server")
while ws.readyState == Open:
let packet = await ws.receiveStrPacket()
await ws.send(packet)
resp "<h1>Hello, Prologue!</h1>"
字符串
这并没有告诉我它实际上是如何工作的,也没有告诉我客户端需要什么样子才能连接到它。我需要在这里做什么?
1条答案
按热度按时间j2datikz1#
客户端
JS端的可行客户端实际上并不比简单地编写复杂得多:
字符串
这将在每次收到消息时向浏览器控制台写入一条消息,并在建立连接时向服务器发送一条消息。
然而,让我们编写一个稍微复杂一点的客户端来进行实验,它将向您展示您和服务器之间的消息交换:
型
服务端
服务器需要做两件事:
1.处理创建+接收WebSocket消息
1.为客户服务
1.处理创建+接收WebSocket消息
下面是处理消息的方法(Prologue在后台使用了treeforms
ws
库):型
只要WebSocket打开,Prologue就会在
while
循环中等待。函数handleMessage
将在每次收到消息时被触发。如果你想将一个给定的消息路由到以不同方式处理不同类型消息的特定进程,你可以从
handleMessage
开始实现它,并根据事件本身决定返回或不返回响应消息。处理程序上的
{.gcsafe.}
杂注通知编译器,此proc * 假定 * 是垃圾收集安全的(在此proc运行时,不能访问可能被垃圾收集的内存)。这将导致编译出错,因为访问像connections
这样的全局可变变量是nevergc-safe的,因为理论上它可能会消失。在这种情况下,这种情况不会发生,因为全局变量将在程序的整个运行时都存在。所以我们必须通知编译器使用{.cast(gcsafe).}:
是可以的。注意:此服务器不实现心跳机制(WebSocket包提供了一个),也不处理 * 关闭的连接 *!因此,目前您的连接seq将只填充。
2.服务客户端
至于为客户端提供服务,您可以在编译时读取HTML文件并将该HTML字符串作为响应提供:
型
服务器其余部分
然后,您的实际服务器可以使用这2个handler-procs(又名控制器),就像您通常设置一个序言应用程序一样。
型