握手响应前连接关闭

4
我写了一个 Node 程序,遇到了一个大难题。
以下是服务器端的代码:
var express=require("express");
var app=express();
var socketio=require("socket.io");
var server=require("http").Server(app);
var ws=socketio.listen(server);
app.use(express.static('public'));
app.listen(3000);
ws.on('connection',function(socket){
socket.on("message",function(msg){
    console.log("got:"+msg);
    socket.send('pong');
    });
});

客户端的代码如下:
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>websocket echo</title>
</head>
<body>
<h1>websocket echo</h1>
<h2>latency:<span id="latency"></span>ms</h2>
<script>

var lastMessage;
window.onload=function(){
    //create socket

    var ws=new WebSocket("ws://127.0.0.1:3000");
    ws.onopen=function(){
        //send first ping
        ping();
    };
    // 监听Socket的关闭
    ws.onclose = function(event) {
        console.log('Client notified socket has closed',event);
    };
    ws.onmessage=function(ev){
        console.log("got:"+ev.data);

        document.getElementById("latency").innerHTML=new Date-lastMessage;
        ping();
    };
    function ping(){
        lastMessage= + new Date;
        ws.send("ping");
    }
}
</script>
</body>
</html>

在Chrome控制台中有如下提示: WebSocket连接到'ws://127.0.0.1:3000/'失败:在接收到握手响应之前连接已关闭(index):16 客户端通知套接字已关闭CloseEvent

1
为什么不要在服务器和客户端都使用 socket.io 呢?它会处理连接。 - YuS
这段代码完全无效,你根本没有使用WebSockets。你在服务器文件中使用了socket,但是你试图从客户端片段连接到websocket。请参考此处的websocket使用示例 - Ravi
1
@Ravi 他正在使用 socket.io,而不是 ws。如果支持的话,socket.io 会将连接从轮询升级到 WebSockets,因此您需要使用在“/socket.io/socket.io.js”上提供的 socket.io 库。 - Ben Fortune
@Ben 感谢您的信息。 @user3543469,你可以按照Ben提到的方法,添加 socket.io.js,代码如下:<script src =“http://127.0.0.1:3000/socket.io/socket.io.js”></script> - Ravi
谢谢。我已经解决了我的问题,将socket.io更改为ws。 - user3543469
可能不是原问题的解决方案,但我一直在尝试让socket.io与restify和CORS一起工作,在某个时候添加了这个:io.set("origins", "*"); 删除它解决了我遇到的类似错误信息。 - chris
1个回答

1

如评论中所述,这是因为socket.io应该与自己的客户端连接。您应该在两侧都使用websockets或socket.io。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接