2017-09-05 37 views
0

我想建立一个ExpressJS websocket后端为基于jQuery的前端使用HTML5网络套接字。与ExpressJS和JQuery的基本Web插座

的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包。

任何提示将不胜感激。

+0

我试过后端代码的变化(删除'app.use()'函数,并添加一个处理程序的主页末端代码是),一切工作正常。你可以添加更多关于错误的信息吗?前端是否托管在同一台服务器上? –

+0

@ M.Sallam - 你能详细说明你做了什么并作为答案吗?前端通过快递托管在同一台服务器上并提供网页服务。有一个端口(3000)用于正规快递,第二个端口(5000)用于网络套接字。 – Karric

回答

1

后端代码:

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.useapp.get

而且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。那是一个错误吗?

0

使用socket.io禁食和最可靠,它是更容易实施和配置。