刷新页面后,Socket.io客户端无法从服务器接收数据

时间:2014-08-05 16:28:50

标签: angularjs socket.io

我正在尝试将socket.io 1.0添加到我的angularjs web应用程序中。我在angularjs中有两个视图,套接字侦听器在第一个视图中定义。在第一个视图中,无论是否刷新页面,它们始终可以从套接字服务器接收消息。

但是当我转到第二个视图时,客户端只能第一次收到该消息。如果我刷新第二个视图,使用ctrl + C关闭服务器并重新启动它,客户端无法接收&打印数据。它确实重新连接到套接字服务器,服务器确实发送了消息。我通过打印连接信息确认了它,并显示"已连接"在发送消息之前是真的。我也尝试了类似强制新连接的事情:真实,但它没有用。

以下是我的代码:

服务器端:

var express = require('express');
var app = module.exports = express();
var server = require('http').createServer(app);
// Hook Socket.io into Express
var io = require('socket.io').listen(server);
// Socket.io Communication
var socket = require('./scripts/socket.js');
// io.sockets.on('connection', socket);
//The code below are added for testing socket.io of prodApp
var job = "{\"id\": 554120,\"name\": \"vidhyachrometest\", \"facility_id\": 2,\"location\": [], \"staff\": [],\"log\": []}";
var dataJob = JSON.parse(job);

io.sockets.on('connection', function(socket){
    console.log('connection', socket);
    socket.emit('job:received', dataJob);   
    console.log('Message sent');
});

server.listen(3000, function() {
  console.log("Express server listening on port %d in %s mode", this.address().port, app.settings.env);
});

客户端: Service.js

angular.module('starter.services', ['LocalStorageModule'])
.factory('socket', function($rootScope){
    /* Locate socket IO server via the ip and port*/
    var socket = io.connect("http://127.0.0.1:3000");
    socket.on('connect', function(){alert("Connect")});
    socket.on('reconnect', function(){alert("Reconnect")});
    socket.on('reconnecting', function(){alert("Reconnecting")});
    return {
        on: function(eventName, callback) {
            socket.on(eventName, function() {
                var args = arguments;
                $rootScope.$apply(function() {
                    callback.apply(socket, args);
                });
            });
        },
        emit: function(eventName, data, callback) {
            socket.emit(eventName, data, function() {
                var args = arguments;
                $rootScope.$apply(function() {
                    if (callback) {
                        callback.apply(socket, args);
                    }
                });
            });
        }
    };
})

Controller.js

var url = 'data/jobs.json';
//Socket.io listeners
//Assume the data is a json object of a new job to a specific facility
socket.on('job:received', function(data){
    alert(data);
    httpCache.add(url, data);
    // alert("after: " + JSON.parse(cachedJobs[1]).length);     
    if($scope.user.role_id == localStorageService.get('Manager')){
        Helpers.incrementPendingnum();
        $rootScope.pendingnum = localStorageService.get('pendingnum');
        data.pending = "Pending";
        $rootScope.jobs.push(data);
        localStorageService.set("joblist", $rootScope.jobs);
    }
});

如果需要,这是连接信息:

connection { nsp:
   { name: '/',
     server:
      { nsps: [Object],
        _path: '/socket.io',
        _serveClient: true,
        _adapter: [Function: Adapter],
        _origins: '*:*',
        sockets: [Circular],
        eio: [Object],
        engine: [Object] },
     sockets: [ [Circular] ],
     connected: { GLhGYMCy2FAXCYUXAAAA: [Circular] },
     fns: [],
     ids: 0,
     acks: {},
     adapter: { nsp: [Circular], rooms: [Object], sids: [Object], encoder: {} },

     _events: { connection: [Function] } },
  server:
   { nsps: { '/': [Object] },
     _path: '/socket.io',
     _serveClient: true,
     _adapter: [Function: Adapter],
     _origins: '*:*',
     sockets:
      { name: '/',
        server: [Circular],
        sockets: [Object],
        connected: [Object],
        fns: [],
        ids: 0,
        acks: {},
        adapter: [Object],
        _events: [Object] },
     eio:
      { clients: [Object],
        clientsCount: 1,
        pingTimeout: 60000,
        pingInterval: 25000,
        upgradeTimeout: 10000,
        maxHttpBufferSize: 100000000,
        transports: [Object],
        allowUpgrades: true,
        allowRequest: [Function],
        cookie: 'io',
        ws: [Object],
        _events: [Object] },
     engine:
      { clients: [Object],
        clientsCount: 1,
        pingTimeout: 60000,
        pingInterval: 25000,
        upgradeTimeout: 10000,
        maxHttpBufferSize: 100000000,
        transports: [Object],
        allowUpgrades: true,
        allowRequest: [Function],
        cookie: 'io',
        ws: [Object],
        _events: [Object] } },
  adapter:
   { nsp:
      { name: '/',
        server: [Object],
        sockets: [Object],
        connected: [Object],
        fns: [],
        ids: 0,
        acks: {},
        adapter: [Circular],
        _events: [Object] },
     rooms: { GLhGYMCy2FAXCYUXAAAA: [Object] },
     sids: { GLhGYMCy2FAXCYUXAAAA: [Object] },
     encoder: {} },
  id: 'GLhGYMCy2FAXCYUXAAAA',
  client:
   { server:
      { nsps: [Object],
        _path: '/socket.io',
        _serveClient: true,
        _adapter: [Function: Adapter],
        _origins: '*:*',
        sockets: [Object],
        eio: [Object],
        engine: [Object] },
     conn:
      { id: 'GLhGYMCy2FAXCYUXAAAA',
        server: [Object],
        upgraded: false,
        readyState: 'open',
        writeBuffer: [Object],
        packetsFn: [Object],
        sentCallbackFn: [],
        request: [Object],
        checkIntervalTimer: null,
        upgradeTimeoutTimer: null,
        pingTimeoutTimer: [Object],
        transport: [Object],
        _events: [Object] },
     encoder: {},
     decoder: { reconstructor: null, _callbacks: [Object] },
     id: 'GLhGYMCy2FAXCYUXAAAA',
     request:
      { _readableState: [Object],
        readable: false,
        domain: null,
        _events: {},
        _maxListeners: 10,
        socket: [Object],
        connection: [Object],
        httpVersion: '1.1',
        complete: false,
        headers: [Object],
        trailers: {},
        _pendings: [],
        _pendingIndex: 0,
        url: '/socket.io/?EIO=2&transport=polling&t=1407255549764-3',
        method: 'GET',
        statusCode: null,
        client: [Object],
        _consuming: true,
        _dumped: true,
        httpVersionMajor: 1,
        httpVersionMinor: 1,
        upgrade: false,
        _query: [Object],
        res: [Object],
        cleanup: [Function: cleanup],
        read: [Function] },
     onclose: [Function],
     ondata: [Function],
     ondecoded: [Function],
     sockets: [ [Circular] ],
     nsps: { '/': [Circular] } },
  conn:
   { id: 'GLhGYMCy2FAXCYUXAAAA',
     server:
      { clients: [Object],
        clientsCount: 1,
        pingTimeout: 60000,
        pingInterval: 25000,
        upgradeTimeout: 10000,
        maxHttpBufferSize: 100000000,
        transports: [Object],
        allowUpgrades: true,
        allowRequest: [Function],
        cookie: 'io',
        ws: [Object],
        _events: [Object] },
     upgraded: false,
     readyState: 'open',
     writeBuffer: [ [Object] ],
     packetsFn: [ undefined ],
     sentCallbackFn: [],
     request:
      { _readableState: [Object],
        readable: false,
        domain: null,
        _events: {},
        _maxListeners: 10,
        socket: [Object],
        connection: [Object],
        httpVersion: '1.1',
        complete: false,
        headers: [Object],
        trailers: {},
        _pendings: [],
        _pendingIndex: 0,
        url: '/socket.io/?EIO=2&transport=polling&t=1407255549764-3',
        method: 'GET',
        statusCode: null,
        client: [Object],
        _consuming: true,
        _dumped: true,
        httpVersionMajor: 1,
        httpVersionMinor: 1,
        upgrade: false,
        _query: [Object],
        res: [Object],
        cleanup: [Function: cleanup],
        read: [Function] },
     checkIntervalTimer: null,
     upgradeTimeoutTimer: null,
     pingTimeoutTimer:
      { _idleTimeout: 85000,
        _idlePrev: [Object],
        _idleNext: [Object],
        _idleStart: 1407255550303,
        _onTimeout: [Function],
        _repeat: false },
     transport:
      { readyState: 'opening',
        maxHttpBufferSize: 100000000,
        supportsBinary: true,
        _events: [Object],
        sid: 'GLhGYMCy2FAXCYUXAAAA',
        req: null,
        res: null,
        writable: false },
     _events: { close: [Object], data: [Function] } },
  rooms: [],
  acks: {},
  connected: true,
  disconnected: false,
  handshake:
   { headers:
      { host: '127.0.0.1:3000',
        connection: 'keep-alive',
        'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (K
HTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36',
        origin: 'http://localhost:8100',
        accept: '*/*',
        referer: 'http://localhost:8100/',
        'accept-encoding': 'gzip,deflate,sdch',
        'accept-language': 'en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4',
        cookie: 'io=caTBp-s8ImeeiAQwAAAE' },
     time: 'Tue Aug 05 2014 09:19:10 GMT-0700 (US Mountain Standard Time)',
     address: { address: '127.0.0.1', family: 'IPv4', port: 3000 },
     xdomain: true,
     secure: false,
     issued: 1407255550308,
     url: '/socket.io/?EIO=2&transport=polling&t=1407255549764-3',
     query: { EIO: '2', transport: 'polling', t: '1407255549764-3' } } }

真的希望有人可以帮助我。

1 个答案:

答案 0 :(得分:0)

最后,我弄清楚为什么套接字监听器在刷新后不起作用。 angularJS是单页面应用程序,而只有在刷新后才会加载特定视图的相应控制器中定义的函数。因此,在刷新第二个视图后,它无法加载第一个视图中定义的侦听器。这就是客户端和服务器重新连接但听众无法接收消息的原因。

我对此问题的解决方案是将所有套接字侦听器移动到新的控制器socketCtrl,并将其绑定到body标签,而不是特定视图。

如果在每个视图中添加一组侦听器,则在刷新第二个视图之前,它将接收每个消息两次,因为实际上有两个侦听器,一个在第一个视图中,一个在第二个视图中。所以这不是一个好的解决方案。

我还想过在刷新第二个视图后才添加这些控制器。然而,似乎很难检测到刷新,并且两次复制那个大块是一种愚蠢的行为。

相关问题