Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在JavaScript中定义和接收来自多个WebSocket的数据?_Javascript_Java_Angularjs_Sockets_Websocket - Fatal编程技术网

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

如何在JavaScript中定义和接收来自多个WebSocket的数据?,javascript,java,angularjs,sockets,websocket,Javascript,Java,Angularjs,Sockets,Websocket,我有以下代码片段,需要对其进行扩展以定义多个WebSocket,但我不知道如何进行: var registerWebSocketHandlers = function(webSocket) { webSocket.onclose = function(){ setTimeout(service.reopen, reconnectTimeout *= 2); }; webSocket.onopen = function(e) { i

我有以下代码片段,需要对其进行扩展以定义多个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('whater')获取标记为'whater'的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(){...};

使用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('whater')获取标记为'whater'的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(){...};

感谢您的输入,但是您能告诉我如何区分来自不同套接字的消息以及如何启动实例吗?我编辑了我的答案,添加了一些初始化示例。这是起始代码。您可能希望对此进行迭代以改进。您可以通过多种方式区分不同的WebSocket:a)对每个WebSocket使用不同的侦听器函数。b) 在将消息传递给应用程序的其余部分之前,使用另一个侦听器函数添加一些区别信息(实例名称)。c) 使用事件,并将实例名称添加为事件数据的额外属性。谢谢,先生:)我已经找到了答案..但是您的版本看起来更可读、更精确..我仍然对调用套接字的相应处理程序有模糊的想法。。我的意思是,有可能通过多个插座来实现吗??你能详细说明一下你的这一行吗?RegisterWebsocketHandler(webSocket,config.handlers);我指的是config.handlers参数定义。我的版本显示registerWebSocketHandler只有一个参数,然后直接从不同的服务类调用setMessageEventHandler。我确信您需要做的是可能的。这取决于你希望它最终如何工作。下面是我要做的:在SocketFactory中,添加一个onmessage处理程序,该处理程序只需使用实例名称重新广播消息(
webSocket.onmessage=function(event){$rootScope.$emit('socketMessageReceived_'+instanceName,event.data);}
)。然后,从应用程序中的任何位置,收听rootScope事件“socketMessageReceived_firstSocket”。感谢您的输入,但您能告诉我如何区分来自不同套接字的消息以及如何启动实例吗?我编辑了我的回答,添加了一些初始化示例。这是起始代码。您可能希望对此进行迭代以改进。您可以通过多种方式区分不同的WebSocket:a)对每个WebSocket使用不同的侦听器函数。b) 在将消息传递给应用程序的其余部分之前,使用另一个侦听器函数添加一些区别信息(实例名称)。c) 使用事件,并将实例名称添加为事件数据的额外属性。谢谢,先生:)我已经找到了答案..但是您的版本看起来更可读、更精确..我仍然对调用套接字的相应处理程序有模糊的想法。。我的意思是,有可能通过多个插座来实现吗??你能详细说明一下你的这一行吗?RegisterWebsocketHandler(webSocket,config.handlers);我指的是config.handlers参数定义。我的版本显示registerWebSocketHandler只有一个参数,然后直接从不同的服务类调用setMessageEventHandler。我确信您需要做的是可能的。这取决于你希望它最终如何工作。下面是我要做的:在SocketFactory中,添加一个onmessage处理程序,该处理程序只需使用实例名称重新广播消息(
webSocket.onmessage=function(event){$rootScope.$emit('socketMessageReceived_'+instanceName,event.data);}
)。然后从应用程序中的任意位置,收听rootScope事件“socketMessageReceived_firstSocket”。