You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于Nim/Prologue搭建WebSocket客户端-服务端示例?

理解Prologue框架的WebSocket实现并编写客户端

一、服务端代码运行机制

你提供的代码是Prologue框架的WebSocket处理器核心逻辑,拆解其运行流程:

  1. 模块导入:import prologue引入框架核心,import prologue/websocket引入WebSocket扩展模块,提供握手、消息收发等底层能力。
  2. 异步处理器定义:proc hello*(ctx: Context) {.async.}是一个导出的异步HTTP处理器,用于处理WebSocket连接请求。
  3. WebSocket握手:await newWebSocket(ctx)是核心步骤——Prologue会自动完成HTTP到WebSocket的协议升级:检查请求头中的Upgrade、Sec-WebSocket-Key等字段,完成握手后返回一个WebSocket实例,后续通过这个实例进行消息交互。
  4. 消息循环:握手成功后,先发送欢迎消息,然后进入while ws.readyState == Open循环,持续异步等待客户端的文本消息(receiveStrPacket()),收到后立即回显给客户端。
  5. 降级处理: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 13:02:05