Socket.io 套接字io客户端连接两次

Socket.io 套接字io客户端连接两次,socket.io,typescript,angular,Socket.io,Typescript,Angular,当我的socket io客户端连接到服务器时,它会执行两次 这是一个angular 2项目,因此我使用typescript编写代码,如您所见: 类服务器{ 私有app=express(); 私有httpServer=http.createServer(this.app); 私有io=sio.listen(this.httpServer); 私有用户=数组(); 构造函数(){ //routage sur index.html this.app.get(“/”,(req,res)=>{ res

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

这是一个angular 2项目,因此我使用typescript编写代码,如您所见:

类服务器{
私有app=express();
私有httpServer=http.createServer(this.app);
私有io=sio.listen(this.httpServer);
私有用户=数组();
构造函数(){
//routage sur index.html
this.app.get(“/”,(req,res)=>{
res.sendFile(uu dirname+'/index.html');
});
//独立学院
this.app.use(express.static(_dirname+'/');
//连接与解除连接
this.io.on('连接',(套接字:SocketIO.socket)=>{
变量日期=新日期();
log(date+':用户连接'+socket.id');
socket.on('broadcast users srv',(user)=>{
var b=新分支();
var n=新NVNode(b);n.image\u path=用户。\节点。\图像\路径;
var u=新用户(用户。\邮件,用户。\ id,n);
u、 socket=socket.id;
这个.users.push(u);
socket.broadcast.emit('broadcast users clt',u)
});
});
}

}
此.s
此.io
收到
连接事件之前未初始化。如果这是您正在初始化的唯一位置,您只能在连接时订阅
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)
    });


可能会成功。

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

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)
        });
    });
  }
}
类服务器{
私有app=express();
私有httpServer=http.createServer(this.app);
私有io=sio.listen(this.httpServer);
私有用户=数组();
私人s:SocketIO.Socket
构造函数(){
//routage sur index.html
this.app.get(“/”,(req,res)=>{
res.sendFile(uu dirname+'/index.html');
});
//独立学院
this.app.use(express.static(_dirname+'/');
//连接与解除连接
this.io.on('连接',(sock:SocketIO.Socket)=>{
变量日期=新日期();
log(date+':一个连接'+sock.id'的用户);
这个.s=袜子;
this.s.on('broadcast users srv',(user)=>{
var b=新分支();
var n=新NVNode(b);n.image\u path=用户。\节点。\图像\路径;
var u=新用户(用户。\邮件,用户。\ id,n);
u、 socket=this.s.id;
这个.users.push(u);
this.s.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)
        });
    });
  }
}