如何保持Kotlin Ktor websocket处于打开状态
已创建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
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) };
}