如何从不同的服务器连接到websocket?

我有服务器 “windows 7专业版”,我安装了node.js并运行它使用此命令node ws_server.js 按照这里的说明

从运行Apache 2.4 / php 5.6.13的服务器B “Windows Server 2008 R2”中,我想连接到服务器A上的ws_server

在**服务器B *我有一个脚本叫websocket.php与下面的代码

 <script> $(function() { var WebSocketClient = require('websocket').client; var client = new WebSocketClient(); client.on('connectFailed', function(error) { console.log('Connect Error: ' + error.toString()); }); client.on('connect', function(connection) { console.log('WebSocket Client Connected'); connection.on('error', function(error) { console.log("Connection Error: " + error.toString()); }); connection.on('close', function() { console.log('echo-protocol Connection Closed'); }); connection.on('message', function(message) { if (message.type === 'utf8') { console.log("Received: '" + message.utf8Data + "'"); } }); function sendNumber() { if (connection.connected) { var number = Math.round(Math.random() * 0xFFFFFF); connection.sendUTF(number.toString()); setTimeout(sendNumber, 1000); } } sendNumber(); }); client.connect('ws://ServerA:8080/', 'echo-protocol'); }); </script> 

但出于某种原因,我在控制台中得到这个错误。

ReferenceError:require没有定义

我是否需要从服务器A的nodejs文件夹中获取文件并将其包含在客户端脚本中? 如果是的话,我需要包括哪些文件?

注意:我也包含了jQuery文件

EDITED

这是我的客户端代码

  <script> "use strict"; // Initialize everything when the window finishes loading window.addEventListener("load", function(event) { var status = document.getElementById("status"); var url = document.getElementById("url"); var open = document.getElementById("open"); var close = document.getElementById("close"); var send = document.getElementById("send"); var text = document.getElementById("text"); var message = document.getElementById("message"); var socket; status.textContent = "Not Connected"; url.value = "ws://serverB:8080"; close.disabled = true; send.disabled = true; // Create a new connection when the Connect button is clicked open.addEventListener("click", function(event) { open.disabled = true; socket = new WebSocket(url.value, "echo-protocol"); socket.addEventListener("open", function(event) { close.disabled = false; send.disabled = false; status.textContent = "Connected"; }); // Display messages received from the server socket.addEventListener("message", function(event) { message.textContent = "Server Says: " + event.data; }); // Display any errors that occur socket.addEventListener("error", function(event) { message.textContent = "Error: " + event; }); socket.addEventListener("close", function(event) { open.disabled = false; status.textContent = "Not Connected"; }); }); // Close the connection when the Disconnect button is clicked close.addEventListener("click", function(event) { close.disabled = true; send.disabled = true; message.textContent = ""; socket.close(); }); // Send text to the server when the Send button is clicked send.addEventListener("click", function(event) { socket.send(text.value); text.value = ""; }); }); </script> 

Taxicala答案是正确的,你不需要。 我认为你可以尝试这段代码,以查看套接字是否工作

  var ws = new WebSocket('wss://ServerA:8080/', 'echo-protocol'); ws.onopen = function () { console.log('socket connection opened properly'); ws.send("Hello World"); // send a message console.log('message sent'); }; ws.onmessage = function (evt) { console.log("Message received = " + evt.data); }; ws.onclose = function () { // websocket is closed. console.log("Connection closed..."); }; 

为了避免安全错误,您应该创buildWeb套接字服务器而不是http,这是您在相关链接中提供的代码,它适用于生成一个安全的服务器,允许所有站点和方法使用CORS仅用于testingbuild议。

请注意,您需要生成证书,并将其存储在名为certs2的文件夹中,如果您需要说明创build只是google一点的证书,那么有很多很好的答案。

 //CUSTOM var WebSocketServer = require('websocket').server; var https = require('https'); var fs = require('fs'); var options = { key: fs.readFileSync('./certs2/key.pem'), cert: fs.readFileSync('./certs2/key-cert.pem') }; var server = https.createServer(options, function (req, res) { res.setHeader('Access-Control-Allow-Origin', '*'); res.setHeader('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE'); res.setHeader('Access-Control-Allow-Headers', 'Content-Type'); res.writeHead(404); res.end(); }); // END CUSTOM // START YOUR CODE.... server.listen(8080, function() { console.log((new Date()) + ' Server is listening on port 8080'); }); wsServer = new WebSocketServer({ httpServer: server, // You should not use autoAcceptConnections for production // applications, as it defeats all standard cross-origin protection // facilities built into the protocol and the browser. You should // *always* verify the connection's origin and decide whether or not // to accept it. autoAcceptConnections: false }); function originIsAllowed(origin) { // put logic here to detect whether the specified origin is allowed. return true; } wsServer.on('request', function(request) { if (!originIsAllowed(request.origin)) { // Make sure we only accept requests from an allowed origin request.reject(); console.log((new Date()) + ' Connection from origin ' + request.origin + ' rejected.'); return; } var connection = request.accept('echo-protocol', request.origin); console.log((new Date()) + ' Connection accepted.'); connection.on('message', function(message) { if (message.type === 'utf8') { console.log('Received Message: ' + message.utf8Data); connection.sendUTF(message.utf8Data); } else if (message.type === 'binary') { console.log('Received Binary Message of ' + message.binaryData.length + ' bytes'); connection.sendBytes(message.binaryData); } }); connection.on('close', function(reasonCode, description) { console.log((new Date()) + ' Peer ' + connection.remoteAddress + ' disconnected.'); }); }); 

require是一个由nodejs使用的库,它自然不存在于window 。 我相信你正在尝试使用你在nodejs环境中使用的代码。

为了在基于Web的环境中创build套接字,请检出WebSocket参考。

WebSockets是在大多数最新的浏览器版本中实现的,您可以按如下方式创build它们:

 var exampleSocket = new WebSocket("ws://www.example.com/socketserver", "protocolOne");