如何保持Kotlin Ktor websocket处于打开状态

如何保持Kotlin Ktor websocket处于打开状态,kotlin,websocket,ktor,Kotlin,Websocket,Ktor,已创建ktor服务器websocket终结点 尽管处于while(true)循环中,但它拒绝保持打开状态: 服务器 routing { webSocket("/data") { while (true) { send(Frame.Text("Howdy")) delay(5000) } } } const ws = new WebSocket("ws

已创建ktor服务器websocket终结点

尽管处于
while(true)
循环中,但它拒绝保持打开状态:

服务器

routing {
    webSocket("/data") {
        while (true) {
            send(Frame.Text("Howdy"))
            delay(5000)
        }
    }
}
const ws = new WebSocket("ws://www.example.com:1234/data")
客户端(浏览器)

客户端(浏览器)连接并接收消息,但随后套接字关闭

为什么这家店一直关门?我从未发出过“关闭”命令。如何使其保持打开状态,以便发送新的排队消息

参考:

我猜您没有在客户端websocket上注册侦听器,一旦建立连接,它就会因为没有侦听器而断开连接。或者消息正在被接收,但是您需要通过注册显式侦听器将它们输出到某个地方

为了测试你的代码,我试过了。我首先用IntelliJ IDEA CE克隆并打开服务器文件夹。然后,我打开了
Application.kt
文件,并用以下行替换了应用程序模块,与您的示例非常相似:

@Suppress("unused")
fun Application.module() {
    install(WebSockets)
    routing {
        webSocket("/data") {
            send("You are connected!")
            while (true) {
                send(Frame.Text("Howdy"))
                delay(1_000)
            }
        }
    }
}
该教程在第3章中告诉您打开,但这对我不起作用,它总是说
ERROR:undefined
(我猜是因为偏执网络权限?)。然而,在该网页的底部,有一个连接到websocket的示例HTML代码,它成功了!我复制了该示例并对其进行了一些修改,将以下行放入
test.html
文件中:

  <!DOCTYPE html>
  <meta charset="utf-8" />
  <title>WebSocket Test</title>
  <script language="javascript" type="text/javascript">

  var wsUri = "ws://localhost:8080/data";
  var output;

  function init()
  {
    output = document.getElementById("output");
    testWebSocket();
    window.setTimeout(delayedTest, 5000);
  }

  function delayedTest()
  {
    websocket.close();
    //alert("delayed");
  }

  function testWebSocket()
  {
    websocket = new WebSocket(wsUri);
    websocket.onopen = function(evt) { onOpen(evt) };
    websocket.onclose = function(evt) { onClose(evt) };
    websocket.onmessage = function(evt) { onMessage(evt) };
    websocket.onerror = function(evt) { onError(evt) };
  }

  function onOpen(evt)
  {
    writeToScreen("CONNECTED");
    doSend("WebSocket rocks");
  }

  function onClose(evt)
  {
    writeToScreen("DISCONNECTED");
  }

  function onMessage(evt)
  {
    writeToScreen('<span style="color: blue;">RESPONSE: ' + evt.data+'</span>');
    //websocket.close();
  }

  function onError(evt)
  {
    writeToScreen('<span style="color: red;">ERROR:</span> ' + evt.data);
  }

  function doSend(message)
  {
    writeToScreen("SENT: " + message);
    websocket.send(message);
  }

  function writeToScreen(message)
  {
    var pre = document.createElement("p");
    pre.style.wordWrap = "break-word";
    pre.innerHTML = message;
    output.appendChild(pre);
  }

  window.addEventListener("load", init, false);

  </script>

  <h2>WebSocket Test</h2>

  <div id="output"></div>
编辑更新:为了测试套接字是否没有接收消息,或者它是否正在接收消息并没有打印消息,我进一步修改了我的
test.html
文件中的
testWebSocket()
,以包含以下行:

  function testWebSocket()
  {
    websocket = new WebSocket(wsUri);
    //websocket.onopen = function(evt) { onOpen(evt) };
    //websocket.onclose = function(evt) { onClose(evt) };
    //websocket.onmessage = function(evt) { onMessage(evt) };
    //websocket.onerror = function(evt) { onError(evt) };
  }
这些行相当于您的原始代码,我没有得到任何答案。但是,如果我打开Safari网络调试面板并单击数据流,我可以看到HTML页面在超时显式关闭套接字之前仍然在接收
Howdy
事件

  function testWebSocket()
  {
    websocket = new WebSocket(wsUri);
    //websocket.onopen = function(evt) { onOpen(evt) };
    //websocket.onclose = function(evt) { onClose(evt) };
    //websocket.onmessage = function(evt) { onMessage(evt) };
    //websocket.onerror = function(evt) { onError(evt) };
  }