javascript - 如何在 JavaScript 中定义和接收来自多个 WebSocket 的数据?

标签 javascript java angularjs sockets websocket

我有以下代码片段,我需要扩展它来定义多个 WebSocket,但我不知道如何去做:

    var registerWebSocketHandlers = function(webSocket) {
    webSocket.onclose = function(){
        setTimeout(service.reopen, reconnectTimeout *= 2);
    };

    webSocket.onopen = function(e) {
        icc.publish('webSocket.reconnect');
        reconnectTimeout = defaultReconnectTimeout; //reset this
        deferredSend();
    };

    webSocket.onerror = function(e) {
        throw new Error("[WebSocket] An error occured " + e);
    };
    }

    var openConnection = function() {
    connectionWasOpenBefore = true;
    webSocket = new $window.WebSocket(xyz);
    webSocket.id = uniqid();
    registerWebSocketHandlers(webSocket);
    };

    var uniqid = function() {
    return (new Date().getTime()).toString(16);
    }

    service.setMessageEventHandler = function(cb) {
    webSocket.onmessage = function(msg) {
        if(msg.data.indexOf('Status: connected') === 0)
        {
            return;
        }
        var jsonObj = JSON.parse(msg.data);
        cb(jsonObj);
    };
};

如何调整代码以满足多个 WebSocket 的需求并为其附加适当的回调?

最佳答案

使用 multiton 模式。

var socketFactory = module.factory('SocketFactory', function($rootScope){
    var factory = {};
    var instances = {};

    factory.getInstance = function(name, config){
        if(!(name in instances)){
            instances[name] = createNewWebSocketInstance(name, config);
        }
        return instances[name];
    };

    var createNewWebSocketInstance = function(name, config){
        var webSocket = new $window.WebSocket(config.address);
        webSocket.id = uniqid();
        registerWebSocketHandlers(webSocket, name, config.handlers); //etc.
        return webSocket;
    };

    var registerWebSocketHandlers = function(webSocket, name, handlers){
        webSocket.onmessage = function(event){
            $rootScope.$emit('SocketMessageReceived_' + name, event.data);
        };
        //etc...
    };

    return factory;
});

这将按名称分隔不同的 websocket。使用 getInstance('whatever') 获取标记为 'whatever' 的 websocket。

var firstConfig = {url: '*****', username: '****', password: '****', etc: '****'};
// You only need to pass in the config the first time.
var firstWebSocket = SocketFactory.getInstance('firstSocket', firstConfig);
var secondConfig = {url: '####', username: '####', password: '####', etc: '####'};
var secondWebSocket = SocketFactory.getInstance('secondSocket', secondConfig);

接下来,您可以从任何其他区域通过实例名称访问配置的 Websocket。

var firstWebSocket = SocketFactory.getInstance('firstSocket');
// It would probably be a good idea to add this listener in the SocketFactory instead and broadcast an event when there's a message so multiple listeners can respond to it.
firstWebSocket.onmessage = function(){...};
var secondWebSocket = SocketFactory.getInstance('secondSocket');
secondWebSocket.onmessage = function(){...};

关于javascript - 如何在 JavaScript 中定义和接收来自多个 WebSocket 的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32060884/

相关文章:

javascript - 可能的node.js内存过度使用w/express服务器和pm2

Javascript 表格根据值绘制行

javascript - 可以 facebook og :image dynamically pull image from a specific div

javascript - 将 .load html 文件的内容存储在变量中

javascript - JS : Caching data in variables

javascript - 如何在javascript中获取字符串的货币

Java 创建与远程服务器同步的桌面应用程序

java - JetBrains IntelliJ Error launching Intellij Platform - Error invoking main 方法

java - 如何停止在 UIThread 上运行的 Runnable

javascript - AngularJS cookie 不起作用