为什么客户端的socket.disconnect()不会在服务器上触发断开连接事件?

时间:2018-10-03 15:23:22

标签: node.js react-native socket.io

I SOLVED MY PROBLEM WİTH THİS CODE BLOCK


var io = require('socket.io')(server, {
  pingInterval: 10000,
  pingTimeout: 5000,
}).listen(server)

我正在使用socket.io制作聊天应用程序。但是,如果我在15或20秒内没有发生事件,则我的应用将断开与socket.io的连接。我只想在应用关闭时断开连接

服务器端代码;

var server = http.createServer(app);
var io = require('socket.io').listen(server);

io.on('connection', function(socket){
let chatroom;
console.log("User Connected");
io.sockets.emit('connected', "12345");
socket.on('chatRoom', function(room) {
socket.join(room);
chatroom = room;
});

socket.on('messageData', function(msg){
  io.sockets.in(chatroom).emit('messageData', msg);
});
 socket.on('disconnect', function(msg){
  console.log("User DisConnected"); 
});

});

客户端套接字类

import React, { Component } from 'react';
import io from "socket.io-client";

class socketio extends Component{


    static socketConnect = () =>{
       this.socket=io("http://xxx.xxx.xxx.xxx:3000",{jsonp:false});
    }

    static getSocket = () =>{
        return this.socket;
    }
}

export default socketio;

客户端聊天屏幕代码;

import socketio from '../Classes/socketio';
this.socket = socketio.getSocket();

      this.socket.emit('chatRoom', this.state.chatID);

            this.socket.on("messageData",(data) =>{               

            });

1 个答案:

答案 0 :(得分:0)

您在静态方法中的远箭头函数中使用this确实非常令人困惑。 this值很可能是模块中的this值,可能是module本身。无论如何,那都不是存放套接字的好地方,而且非常混乱。


我不知道这是否可以解决您的主要问题,但是您可以通过更改为this,静态方法和粗箭头功能来解决此问题:

import React, { Component } from 'react';
import io from "socket.io-client";

// module level variable, can only be one connected socket with this design
let socket;

class socketio extends Component{
    static function socketConnect() {
       socket = io("http://xxx.xxx.xxx.xxx:3000",{jsonp:false});
    }

    static function getSocket() {
        if (!socket) {
            throw new Error("Must call socketConnect() before getSocket()");
        }
        return socket;
    }
}

export default socketio;

就我个人而言,我不知道为什么要使用一种将您限制为一个连接的设计,而不是创建您的类的实例,然后让该实例存储套接字,但是鉴于您倾向于仅设计一个连接,您可以像上面一样将其设置为模块级变量。