2017-09-05 27 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禁食和最可靠,它是更容易實施和配置。