【问题标题】:socket io client connect twicesocket io 客户端连接两次
【发布时间】:2016-01-25 22:41:23
【问题描述】:

当我的套接字 io 客户端连接到服务器时,它会执行两次 double connection

这是一个 Angular 2 项目,所以我在 typescript 中编码,如您所见:

class Server {
    private app = express();
    private httpServer = http.createServer(this.app);
    private io = sio.listen(this.httpServer);
    private users = Array<User>();
    constructor() {
        //routage sur index.html
        this.app.get('/',(req, res) => {
            res.sendFile(__dirname + '/index.html');
        });
        //ajout des dépendences
        this.app.use(express.static(__dirname + '/'));
        //connexion & deconnexion
        this.io.on('connection', (socket: SocketIO.Socket) => {
            var date = new Date();
            console.log(date+' : a user connected '+socket.id);
            
            socket.on('broadcast users srv',(user) => {
                var b = new Branch();
                var n = new NVNode(b);n.image_path = user._node._image_path;
                var u = new User(user._mail,user._id,n);
                u.socket = socket.id;
                this.users.push(u);
                socket.broadcast.emit('broadcast users clt',u)
            });
          });
      }
}

我试着这样编码:

class Server {
    private app = express();
    private httpServer = http.createServer(this.app);
    private io = sio.listen(this.httpServer);
    private users = Array<User>();
    private s : SocketIO.Socket
    constructor() {
        //routage sur index.html
        this.app.get('/',(req, res) => {
            res.sendFile(__dirname + '/index.html');
        });
        //ajout des dépendences
        this.app.use(express.static(__dirname + '/'));
        //connexion & deconnexion
        this.io.on('connection', (sock: SocketIO.Socket) => {
            var date = new Date();
            console.log(date+' : a user connected '+sock.id);
            this.s = sock;
            
        });
        
        this.s.on('broadcast users srv',(user) => {
            var b = new Branch();
            var n = new NVNode(b);n.image_path = user._node._image_path;
            var u = new User(user._mail,user._id,n);
            u.socket = this.s.id;
            this.users.push(u);
            this.s.broadcast.emit('broadcast users clt',u)
        });
      }
}

但不幸的是,它向我显示了这个错误: error server

服务器告诉该值未初始化==>“未定义”

我真的不知道该怎么办:( 如果你有想法!

【问题讨论】:

    标签: socket.io typescript angular


    【解决方案1】:

    this.s 未初始化,直到 this.io 收到 "connection" 事件。如果这是您唯一初始化的地方,您只能在连接时订阅 this.s 到其他事件。

    切换

        this.io.on('connection', (sock: SocketIO.Socket) => {
            var date = new Date();
            console.log(date+' : a user connected '+sock.id);
            this.s = sock;
    
        });
    
        this.s.on('broadcast users srv',(user) => {
            var b = new Branch();
            var n = new NVNode(b);n.image_path = user._node._image_path;
            var u = new User(user._mail,user._id,n);
            u.socket = this.s.id;
            this.users.push(u);
            this.s.broadcast.emit('broadcast users clt',u)
        });
    

        this.io.on('connection', (sock: SocketIO.Socket) => {
            var date = new Date();
            console.log(date+' : a user connected '+sock.id);
            this.s = sock;
    
            this.s.on('broadcast users srv',(user) => {
                var b = new Branch();
                var n = new NVNode(b);n.image_path = user._node._image_path;
                var u = new User(user._mail,user._id,n);
                u.socket = this.s.id;
                this.users.push(u);
                this.s.broadcast.emit('broadcast users clt',u)
            });
        });
    

    可能会成功。

    【讨论】:

    【解决方案2】:

    您正在尝试在初始化之前使用s。通过将this.s.on 调用移动到this.io.on 回调中,您将确保s 不是undefined

    class Server {
      private app = express();
      private httpServer = http.createServer(this.app);
      private io = sio.listen(this.httpServer);
      private users = Array<User>();
      private s : SocketIO.Socket
      constructor() {
        //routage sur index.html
        this.app.get('/',(req, res) => {
            res.sendFile(__dirname + '/index.html');
        });
        //ajout des dépendences
        this.app.use(express.static(__dirname + '/'));
        //connexion & deconnexion
        this.io.on('connection', (sock: SocketIO.Socket) => {
            var date = new Date();
            console.log(date+' : a user connected '+sock.id);
            this.s = sock;
            this.s.on('broadcast users srv',(user) => {
              var b = new Branch();
              var n = new NVNode(b);n.image_path = user._node._image_path;
              var u = new User(user._mail,user._id,n);
              u.socket = this.s.id;
              this.users.push(u);
              this.s.broadcast.emit('broadcast users clt',u)
            });
        });
      }
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-14
    • 2022-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多