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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/32016487/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-28 14:44:13  来源:igfitidea点击:

How to connect to a websocket from a different server?

javascriptjquerynode.jswebsocket

提问by Junior

I have server A"windows 7 Pro" where I installed node.jsand ran it using this command node ws_server.jsfollowing the instructions here

我有服务器 A“windows 7 Pro”,我在其中安装了node.js按照此处的说明使用此命令运行它node ws_server.js

From server B"Windows Server 2008 R2" running Apache 2.4/php 5.6.13 I want to connect to the ws_serveron Server A.

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

on **Server B* I have a script called websocket.phpwith the code below

在 **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>

But for some reason I get this error in the console.

但出于某种原因,我在控制台中收到此错误。

ReferenceError: require is not defined

参考错误:需要未定义

Do I need to take files from the nodejs folder from server A and include it in the client script? if so which files do I need to include?

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

Note:I have included jQuery files as well

注意:我也包含了 jQuery 文件

EDITED

已编辑

this is my client code

这是我的客户端代码

       <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>

采纳答案by ecarrizo

Taxicala answer is correct, you dont need require. I think that you could try this piece of code in order to see if the sockets are working

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...");
 };

In order to avoid the security error you should create the web socket server as https instead of http, This is the code that you provided in the related links, it is adapted to generate a secure server that allow CORS for all sites and methods, its only for testing proposes.

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

Note that you need to generate the certificates, and store it in a folder named certs2, if you need instructions to create the certs just google a little, there are a lot of great answer for that.

请注意,您需要生成证书,并将其存储在名为 certs2 的文件夹中,如果您需要创建证书的说明,只需 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.');
    });
});

回答by taxicala

requireis a library used by nodejs, it's not present in windownaturally,. I believe you are trying to use a code that you had been using in a nodejs environment.

require是 nodejs 使用的库,它在window自然中不存在,。我相信您正在尝试使用您在 nodejs 环境中使用过的代码。

In order to create the socket in a web based environment, checkout the WebSocketreference.

为了在基于 Web 的环境中创建套接字,请查看WebSocket参考。

WebSocketsare implemented in most latest browsers versions and you create them as follows:

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

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

回答by Royal.O

I had faced socket hangup error.

我遇到了套接字挂断错误。

const WebSocket = require('ws');
const ws = new WebSocket('wss://127.0.0.1:8080');

events.js:183
      throw er; // Unhandled 'error' event
      ^

Error: socket hang up
    at TLSSocket.onHangUp (_tls_wrap.js:1137:19)
    at Object.onceWrapper (events.js:313:30)
    at emitNone (events.js:111:20)
    at TLSSocket.emit (events.js:208:7)
    at endReadableNT (_stream_readable.js:1064:12)
    at _combinedTickCallback (internal/process/next_tick.js:138:11)
    at process._tickCallback (internal/process/next_tick.js:180:9)

And I could fix that by modifying websocket connection code.

我可以通过修改 websocket 连接代码来解决这个问题。

const ws = new WebSocket('ws://127.0.0.1:8080/ws');