javascript - 使用 ExpressJS 和 Jquery 的基本 Web Socket

标签 javascript jquery node.js sockets

我正在尝试使用 HTML5 Web 套接字为基于 jQuery 的前端构建 ExpressJS Websocket 后端。

ExpressJS 后端代码实际上是从 https://github.com/websockets/ws#expressjs-example 复制粘贴的

JavaScript前端代码是:

var socket = new WebSocket("ws://localhost:8080");

socket.onopen = function(){
    console.log( "OPENED : ", socket.readyState );
}

socket.onmessage = function(msg){
    console.log( msg );
}

socket.onclose = function(){
    console.log( "CLOSED : ", socket.readyState );
}

setTimeout(function(){
    socket.send('test');
}, 2000);

在 Chrome 中,我收到错误:“连接在收到握手响应之前已关闭”。我在网上寻找解决方案,但它们都是基于 socket.io 的,而我只是使用 NodeJS ws 包。

任何提示将不胜感激。

最佳答案

后端代码:

const express = require('express')
const http = require('http')
const WebSocket = require('ws')
var path = require('path')

const app = express()

app.get('/', (req, res) => {
  res.sendFile(path.join(__dirname + '/a.html'))
})

const server = http.createServer(app)
const wss = new WebSocket.Server({ server })

wss.on('connection', function connection (ws, req) {
  ws.on('message', function incoming (message) {
    console.log('received: %s', message)
  })

  ws.send('something')
})

server.listen(8080, function listening () {
  console.log('Listening on %d', server.address().port)
})

唯一的变化是第 8 行的 app.get,而不是您提供的链接中提供的 app.use

并且a.html文件只有前端脚本:

<html>
  <head>

  </head>
  <body>
    <script>
      var socket = new WebSocket("ws://localhost:8080");

      socket.onopen = function () {
        console.log("OPENED : ", socket.readyState);
      }

      socket.onmessage = function (msg) {
        console.log(msg);
      }

      socket.onclose = function () {
        console.log("CLOSED : ", socket.readyState);
      }

      setTimeout(function () {
        socket.send('test');
      }, 2000);
    </script>
  </body>

</html>

一切都工作正常。

您说您正在端口 3000 上运行服务器,但您正在尝试在前端代码中连接到端口 8080。这是一个错误吗?

关于javascript - 使用 ExpressJS 和 Jquery 的基本 Web Socket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46045768/

相关文章:

javascript - .length 的事件监听器

javascript - Discord.js:机器人发送相同的嵌入两次

javascript - 如何通过服务与 Angular.js 和 Node.js 建立连接?

javascript 无法与 HTML 正确链接。怎么修?

javascript - 如何禁用 TextBox(如果它不为空) 通过页面加载上的 JavaScript

javascript - 为数字计数器添加不同的后缀

javascript - 根据指定的数据属性隐藏元素

Javascript:如何确定是否 promise 一个功能?

node.js - jsonschema 与 Postman

javascript - Node.js:以 win1251 字符集发送 http 请求