如何基于Nim/Prologue搭建WebSocket客户端-服务端示例?
理解Prologue框架的WebSocket实现并编写客户端
一、服务端代码运行机制
你提供的代码是Prologue框架的WebSocket处理器核心逻辑,拆解其运行流程:
- 模块导入:
import prologue引入框架核心,import prologue/websocket引入WebSocket扩展模块,提供握手、消息收发等底层能力。 - 异步处理器定义:
proc hello*(ctx: Context) {.async.}是一个导出的异步HTTP处理器,用于处理WebSocket连接请求。 - WebSocket握手:
await newWebSocket(ctx)是核心步骤——Prologue会自动完成HTTP到WebSocket的协议升级:检查请求头中的Upgrade、Sec-WebSocket-Key等字段,完成握手后返回一个WebSocket实例,后续通过这个实例进行消息交互。 - 消息循环:握手成功后,先发送欢迎消息,然后进入
while ws.readyState == Open循环,持续异步等待客户端的文本消息(receiveStrPacket()),收到后立即回显给客户端。 - 降级处理:
resp "<h1>Hello, Prologue!</h1>"仅在WebSocket握手失败时执行(比如客户端发送的是普通HTTP请求),此时会返回一个普通HTML响应。
二、完整可运行的服务端代码
你提供的代码缺少路由注册和服务器启动逻辑,补充后完整代码如下:
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>" when isMainModule: var app = initPrologue() # 注册WebSocket路由,绑定到/ws路径 app.addRoute("/ws", hello, HttpGet) # 启动服务器,默认监听8080端口 app.run()
运行方式:用nim c -r 文件名.nim编译并运行,服务器会在localhost:8080启动。
三、客户端示例
1. 浏览器端JavaScript客户端
用原生WebSocket API编写,直接在浏览器中运行:
<!DOCTYPE html> <html> <body> <input type="text" id="msgInput" placeholder="输入消息"> <button onclick="sendMsg()">发送</button> <div id="log"></div> <script> // 连接到服务端WebSocket地址 const ws = new WebSocket('ws://localhost:8080/ws'); ws.onopen = () => log('已连接到WebSocket服务器'); ws.onmessage = (event) => log('收到服务器消息: ' + event.data); ws.onclose = () => log('与服务器的连接已关闭'); function sendMsg() { const input = document.getElementById('msgInput'); const msg = input.value.trim(); if (msg) { ws.send(msg); input.value = ''; } } function log(text) { const logDiv = document.getElementById('log'); logDiv.innerHTML += `<p>${text}</p>`; } </script> </body> </html>
使用:保存为HTML文件后在浏览器打开,输入消息点击发送即可与服务器进行echo通信。
2. Nim语言客户端
使用Nim官方的websocket库(先执行nimble install websocket安装):
import asyncdispatch, websocket proc main() {.async.} = var ws = await newWebSocket("ws://localhost:8080/ws") echo "已连接到服务器" # 启动协程异步接收服务器消息 asyncCheck: while ws.readyState == Open: let msg = await ws.receiveStrPacket() echo "收到服务器: ", msg # 控制台输入消息发送给服务器 while true: stdout.write("输入消息(输入exit退出): ") stdout.flushFile() let msg = stdin.readLine() if msg == "exit": await ws.close() break await ws.send(msg) waitFor main()
运行方式:nim c -r 客户端文件名.nim,输入消息即可交互,输入exit关闭连接。
内容的提问来源于stack exchange,提问作者Philipp Doerner
相关产品推荐
相关产品推荐

