Socket.io: ํด๋ผ์ด์–ธํŠธ ์ธก์˜ socket.disconnect()๊ฐ€ ์„œ๋ฒ„์—์„œ ์—ฐ๊ฒฐ ํ•ด์ œ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์— ๋งŒ๋“  2015๋…„ 11์›” 04์ผ  ยท  23์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: socketio/socket.io

๋‚ด ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ณ ๊ฐ ์ž…์žฅ์—์„œ

 var socket = io.connect('http://' + serverAddress ,{ reconnection: false, forceNew: true  }  );

 socket.emit('monitorAddedNotify' , { video: sourceVideo , socketId: socket.id});

 socket.on('disconnectThatSoc', function(){
    socket.disconnect();
});

์„œ๋ฒ„ ์ธก:

  io.on('connection', function (socket) {
    console.log('a user connected');


    socket.on('disconnect', function () {
        console.log('user disconnected');
    });
 });

socket.disconnect() ๋ฉ”์„œ๋“œ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

Unable to reproduce

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋‹น์‹ ์€ ๋ฐ”๋ณด์ž…๋‹ˆ๊นŒ? ํด๋ผ์ด์–ธํŠธ์—์„œ๋Š” ๋ฐฉ์ถœ์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์ง€๋งŒ ์„œ๋ฒ„์—์„œ๋Š” ๋ฐฉ์ถœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๊บผ์ ธ

๋ชจ๋“  23 ๋Œ“๊ธ€

๋‚ด๊ฐ€ ํ…Œ์ŠคํŠธ ํ•œ ํ•œ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

F5 ๋ฒ„ํŠผ์„ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ˆŒ๋Ÿฌ ํŽ˜์ด์ง€๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ๋น ๋ฅด๊ฒŒ ์ƒˆ๋กœ๊ณ ์นจ์„ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ๋‚˜์—๊ฒŒ๋„ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์–ด๋–ค ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๊นŒ? ์ตœ์‹  Firefox๋ฅผ ์‚ฌ์šฉ ์ค‘์ด๊ณ  ๋น ๋ฅด๊ฒŒ ๋‹ค์‹œ ๋กœ๋“œํ•  ๋•Œ "์‚ฌ์šฉ์ž ์—ฐ๊ฒฐ ๋Š๊น€"์ด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋„ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ž‘์—…์—์„œ๋Š” ์—ฐ๊ฒฐ์ด ๋Š์–ด์ง€์ง€๋งŒ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•œ ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋Šฆ๊ฒŒ ์˜ต๋‹ˆ๋‹ค.

๋ธŒ๋ผ์šฐ์ €: ํฌ๋กฌ 55.0.2883.95(64๋น„ํŠธ)
socket.io: "^1.7.2"

์•ˆ๋…•ํ•˜์„ธ์š” @ventaquil์ž…๋‹ˆ๋‹ค. F5 ํ‚ค๋ฅผ ๋ˆ„๋ฅธ ์ƒํƒœ์—์„œ ์—ฐ๊ฒฐ ํ•ด์ œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ์ด๊ฒƒ์„ ๊ทน๋ณต ํ–ˆ์Šต๋‹ˆ๊นŒ?

@giathinh910 ์€ ์ฃผ์–ด์ง„ ์ง€์—ฐ ํ›„์— disconnect ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ( ์—ฌ๊ธฐ ์— ๋ฌธ์„œํ™”๋œ pingTimeout / pingInterval ์˜ต์…˜๊ณผ ๊ด€๋ จ๋  ์ˆ˜ ์žˆ์Œ)?

@darrachequesne ๋‚ด ๋ฌธ์ œ๋Š” ์œ„์—์„œ ์„ค๋ช…ํ•œ @ventaquil ๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. "F5 ๋ฒ„ํŠผ์„ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ˆŒ๋Ÿฌ ํŽ˜์ด์ง€๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ๋น ๋ฅด๊ฒŒ ๋‹ค์‹œ ๋กœ๋“œํ•˜์„ธ์š”." ์ผ๋ฐ˜์ ์œผ๋กœ ํŽ˜์ด์ง€ ์†Œ์ผ“ ์—ฐ๊ฒฐ์„ ์ƒˆ๋กœ ๊ณ ์น  ๋•Œ "์—ฐ๊ฒฐ ๋Š๊ธฐ"๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ๋‹ค์‹œ "์—ฐ๊ฒฐ"์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์˜จ๋ผ์ธ ์‚ฌ์šฉ์ž ์ˆ˜๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์œ„ํ•ด ์ด 2๊ฐ€์ง€ ์ด๋ฒคํŠธ์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํŽ˜์ด์ง€๊ฐ€ ์ถฉ๋ถ„ํžˆ ๋น ๋ฅด๊ฒŒ ๋‹ค์‹œ ๋กœ๋“œ๋˜๋ฉด "์—ฐ๊ฒฐ ํ•ด์ œ"๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š์•„ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์‚ฌ์šฉ์ž ์†Œ์ผ“ ID๊ฐ€ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋น„ํ˜„์‹ค์ ์ธ ์‚ฌ๋žŒ๋“ค์€ ๋ฌผ๋ก  pingTimeout ํ›„์— ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์†Œ์ผ“ ๋ฒˆํ˜ธ๊ฐ€ ์•„๋‹Œ ์˜จ๋ผ์ธ ์‚ฌ์šฉ์ž์—๊ฒŒ๋งŒ ํ‘œ์‹œ๋˜๋Š” ์†Œ์ผ“ ID ์ €์žฅ ๋ฐฉ๋ฒ•์„ ๋ณ€๊ฒฝํ•˜๊ณ  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ €๋Š” ์ด ๋ฌธ์ œ๋ฅผ ์ด๋Ÿฐ ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„์—์„œ ํ•˜ํŠธ๋น„ํŠธ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ์—์„œ ์ด๋ฏธ ๋ฐœ์‹ ์ž๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
socket.on("heartbeat", function() { // console.log('heartbeat called!'); hbeat[socket.id] = Date.now(); setTimeout(function() { var now = Date.now(); if (now - hbeat[socket.id] > 5000) { console.log('this socket id will be closed ' + socket.id); if (addedUser) { --onlineUsers; removeFromLobby(socket.id); try { // this is the most important part io.sockets.connected[socket.id].disconnect(); } catch (error) { console.log(error) } } } now = null; }, 6000); });

ํ˜ธ์ถœํ•  ์ด ์ฝ”๋“œ ํ•จ์ˆ˜๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

io.sockets.connected[socket.id].disconnect();

์ด๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹โ€‹โ€‹๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. F5/์ƒˆ๋กœ๊ณ ์นจ์ผ ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ํŠน์ • ๋‹จ๊ณ„์—์„œ ํƒญ์„ ์—ด์—ˆ๋‹ค๊ฐ€ ๋น ๋ฅด๊ฒŒ ๋‹ซ์œผ๋ฉด ์—ฐ๊ฒฐ ํ•ด์ œ๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์†Œ์ผ“์ด ๋งค์šฐ ๋น ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์žฌํ˜„ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ๋กœ์ปฌ์—์„œ ์‹คํ–‰ํ•  ๋•Œ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ํƒญ์„ ์—ด๊ณ  ๋‹ค๋ฅธ ํƒญ์„ ์—ด๋ฉด ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค(๋กœ์ปฌ). ํ•ด๊ฒฐํ•ด์•ผ ํ•  ์ค‘์š”ํ•œ ๋ฒ„๊ทธ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚ด ๊ฒŒ์ž„ ์„œ๋ฒ„์— ์œ ๋ น ๊ฒŒ์ž„์„ ๋งŒ๋“ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์—ฐ๊ฒฐ ํ•ด์ œํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ถ€ ๋ฐฉ์ถœ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋„์›€์ด ๋ ์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ๋ญ”๊ฐ€ ์–ป์€ ๊ฒƒ ๊ฐ™์•„์š”... ์•„๋งˆ๋„...

ํด๋ผ์ด์–ธํŠธ :

function ManualSocketDisconnect() {
    socket.emit("manual-disconnection", socket.id);

    socket.close();

    console.log("Socket Closed. ");
}

์„œ๋ฒ„ :

io.on("connection", function(socket) {
    console.log("User " + socket.id + " Connected. ");

    socket.on("manual-disconnection", function(data) {
        console.log("User Manually Disconnected. \n\tTheir ID: " + data);
    });
});

๋ฏธ์•ˆํ•˜์ง€๋งŒ ๋‚ด ์ฝ”๋“œ์— ์•ฝ๊ฐ„์˜ ๊ตฌ๋ฉ์„ ๋‚จ๊ฒผ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ „๋ฌธ๊ฐ€๊ฐ€ ์•„๋‹ˆ๋‹ค. ๐Ÿ™

๋‚˜๋Š” ๊ฐ™์€ ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค!
๋‚˜๋Š” ReactJS-ExpressJS์—์„œ ์˜ˆ์ œ๋ฅผ ์ œ๊ณตํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ์ƒํ™ฉ์ด๋ฉฐ componentWillUnmount() ์— ์บก์Šํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

componentWillUnmount() ์—์„œ ์‹คํ–‰ํ•  ๋‘ ์ด๋ฒคํŠธ๋ฅผ ๋น„๊ตํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

  1. newMessage :- ํŠน์ • ๋ฐฉ์— ๋ฉ”์‹œ์ง€๋ฅผ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค.
  2. disconnect :-(์ž‘๋™ํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž์ง€๋งŒ ์ž‘๋™ํ•˜์ง€ ์•Š์Œ) ์ด ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ์—๋Š” ์—ฐ๊ฒฐ์ด ๋Š๊ธธ ์ฝœ๋ฐฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝœ๋ฐฑ์ด ๋งž๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด console.log() ๋ฅผ ํฌํ•จํ–ˆ์Šต๋‹ˆ๋‹ค.

์ž, ์ด์ œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค:-
๊ณ ๊ฐ:-

๋‹ค์Œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.-

  componentDidMount() {
    console.log(this.props)
    chat.emit('authenticate', {
      token: localStorage.getItem('auth'),
      refreshToken: localStorage.getItem('refresh'),
      projectId: this.props.projectId,
      userId: this.props.userId,
    });
    chat.on('newMessage', (messageData) => {
      console.log('------------newMessageReceived-------------');
      this.props.messageReceived({ messages: this.props.messages, messageData }, () => {
        console.log('callback');
        this.setState({
          messages: this.props.messages
        })
      })
      console.log(messageData);
    })
  }

๋‹ค์Œ ์ด๋ฒคํŠธ๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  componentWillUnmount() {
    chat.emit('disconnect','just disconnect);
  }

๋‹ค์Œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.(์ผ๋ฐ˜ ๋ฉ”์‹œ์ง€ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”์ง€ ํ…Œ์ŠคํŠธ ๋งŒ ํ•˜๋ฉด ๋จ)

  componentWillUnmount() {
    chat.emit('newMEssage', {
      messageHeader: {
        sender: {
          user: {
            id: this.props.userId,
            name: this.props.name
          }
        }
      },
      messageBody: 'hello',
    });
  }

๋ถˆ์šด

์„ฌ๊ธฐ๋Š” ์‚ฌ๋žŒ:-
๋‹ค์Œ์€ expressJS ๋ฐฑ์—”๋“œ์˜ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

//๋‹ค์Œ initializeChatSocket์€ app.js์—์„œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

function initializeChatSocket(server) {
  projects.hasMany(projectTeam, { foreignKey: 'projectId' });

  const io = socketIO(server);
  const chat = io.of('/chat').on('connection', function (socket) {
    console.log(
      '----------------------------------------New Chat Connection Established-------------------------------------------------------------------------'
    );

    socket.auth = false;

    socket.on('authenticate', function (data) {
      console.log('\n\n\n\n', 'authenticate called', '\n\n\n\n', data, '\n\n\n');

      try {
        const dummyReq = {
          headers: {
            refreshtoken: data.refreshToken,
          },
        };
        console.log('\n\n\n\n', 'before verify', '\n\n\n\n');
        const userDetails = verifyJWTToken(dummyReq, data.token);
        console.log('\n\n\n\n', 'after verify', '\n\n\n\n');
        socket.userId = userDetails.userId;
        socket.projectId = data.projectId;

        projectTeam
          .findAll({
            where: {
              [Op.and]: {
                projectId: data.projectId,
                userId: data.userId,
              }
            }
          })
          .then(projects => {
            console.log('\n\n\n\n', JSON.stringify(projects), '\n\n\n\n');
            if (projects.length === 1) {
              socket.auth = true;
              socket.join(socket.projectId);
              console.log('User id:- ${userDetails.userId} linked to project id :- ${socket.projectId}');
            } else {
              console.log('User id:- ${userDetails.userId} not linked to project id :- ${socket.projectId}');
              throw { message: 'User not linked to project' };
            }
          });
      } catch (error) {
        console.log(String(error));

        socket.auth = false;
        socket.disconnect(String(error));
      }
    });

    socket.on('disconnectt', function() {
      console.log('Client Disconnecting'); // This is not being fired :/
      socket.removeAllListeners('newMessage');
      socket.removeAllListeners('disconnect');
      socket.removeAllListeners('authenticate');
      socket.removeAllListeners('connection');
      });

    socket.on('newMessage', async function (messageData) {
      console.log('-------------------------New Message----------------------', String(messageData));
      //TODO Save Message in Database

      try {
        socket.broadcast.to(socket.projectId).emit('newMessage', messageData);
        console.log('\n\n\n\n\n broadcast sent\n\n' + JSON.stringify(messageData) + '\n\n\n');
      } catch (error) {
        console.log('\n\n\n\n\n broadcast error\n\n\n\n\n');
        console.log(String(error));

        console.log(error);
        //TODO Handle Message Sending Error
      }
    });

  });
}

์ด๊ฒƒ์ด ๋ธŒ๋ผ์šฐ์ €์˜ ๋ฌธ์ œ์ž…๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ ์ปค๋ฎค๋‹ˆํ‹ฐ์— ๋ฌธ์˜ํ•ด์•ผ ํ•˜๋Š” ๋‹ค๋ฅธ ๋ฌธ์ œ์ž…๋‹ˆ๊นŒ?

@manjotsk ์ง€๊ธˆ๊นŒ์ง€ ์ˆ˜์ •ํ–ˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ์„œ๋ฒ„ ์ธก ์ฝ”๋“œ์—์„œ disconnectt (์ด์ค‘ t ์ฃผ์˜)๋ฅผ ์ˆ˜์‹ ํ•˜๊ณ  ์žˆ์ง€๋งŒ ํ”„๋ก ํŠธ ์—”๋“œ๊ฐ€ ๋ฐฉ์ถœ ์ค‘์ž…๋‹ˆ๋‹ค. disconnect . ๋˜ํ•œ ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ์ด ๋Š๊ธธ ๋•Œ ํ•ด๋‹น ์ด๋ฒคํŠธ๊ฐ€ ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„๋กœ ์ „์†ก๋˜์–ด์•ผ ํ•˜๋ฏ€๋กœ disconnect ๋ฅผ ๋‚ด๋ณด๋‚ด๊ณ  ์‹ถ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ค‘๋ณต ips๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์—ฐ๊ฒฐ ํ•ด์ œ ์ด๋ฒคํŠธ๋ฅผ ๋‚ด๋ณด๋‚ด๋Š” ์†Œ์ผ“์— ์˜์กดํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ ํ•ด์ œ๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด ์•ฑ์„ ๋‹ค์‹œ ๋กœ๋“œํ•˜๋Š” ์‚ฌ์šฉ์ž๋Š” ๋น ๋ฅด๊ฒŒ ์ฐจ๋‹จ๋ฉ๋‹ˆ๋‹ค!

@manjotsk ์ง€๊ธˆ๊นŒ์ง€ ์ˆ˜์ •ํ–ˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ์„œ๋ฒ„ ์ธก ์ฝ”๋“œ์—์„œ disconnectt (์ด์ค‘ t ์ฃผ์˜)๋ฅผ ์ˆ˜์‹ ํ•˜๊ณ  ์žˆ์ง€๋งŒ ํ”„๋ก ํŠธ ์—”๋“œ๊ฐ€ ๋ฐฉ์ถœ ์ค‘์ž…๋‹ˆ๋‹ค. disconnect . ๋˜ํ•œ ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ์ด ๋Š๊ธธ ๋•Œ ํ•ด๋‹น ์ด๋ฒคํŠธ๊ฐ€ ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„๋กœ ์ „์†ก๋˜์–ด์•ผ ํ•˜๋ฏ€๋กœ disconnect ๋ฅผ ๋‚ด๋ณด๋‚ด๊ณ  ์‹ถ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
disconnectt ๋Š” ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•˜๋˜ ์‚ฌ๊ธฐ ๊ฐ€๋ช…์ด์—ˆ์Šต๋‹ˆ๋‹ค! ์ง€์ ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์–‘์ชฝ์—์„œ ๋‹ค์‹œ ํ™•์ธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ถ„๋ช…ํžˆ ๊ตฌํ˜„์ด ์ž˜๋ชป๋˜์—ˆ์Šต๋‹ˆ๋‹ค! ๋” ์„ ๋ช…ํ•œ ์‹œ์•ผ๋ฅผ ํ™•๋ณดํ–ˆ์Šต๋‹ˆ๋‹ค! @nathanheffley ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ๐Ÿ‘ :)

@manjotsk ๋ญ?

socket.on ๋Œ€์‹  socket.once๋งŒ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.
"๊ณ ๊ฐ ์ˆ˜์ค€."
์˜ˆ:
socket.on('์—ฐ๊ฒฐ')
์‚ฌ์šฉ
socket.once('์—ฐ๊ฒฐ'
.

์—ฌ๊ธฐ ๋‚ด
socket.on("message") { (dataArray, socketAck) -> ๋ฌดํšจ

  if let data = dataArray.first as? Data{
    do{
      let objc = try JSONDecoder.init().decode(GetChatConversation.self, from: data)
      completionHandler(objc,nil)
    }
    catch let error{
      return completionHandler(nil,error.localizedDescription)
    }
  }else{
    completionHandler(nil,"Cannot cast Array of Any to Data")
  }
}

์•„๋Š” ์‚ฌ๋žŒ์ด ์žˆ์œผ๋ฉด ์ฝœ๋ฐฑ์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

๋‹น์‹ ์€ ๋ฐ”๋ณด์ž…๋‹ˆ๊นŒ? ํด๋ผ์ด์–ธํŠธ์—์„œ๋Š” ๋ฐฉ์ถœ์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์ง€๋งŒ ์„œ๋ฒ„์—์„œ๋Š” ๋ฐฉ์ถœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๊บผ์ ธ

๊ทธ๊ฑด ์ง„์งœ ๋ถ€์ •์ ์ธ ์—๋„ˆ์ง€์•ผ, Ehsan666x.

์ €๋Š” ์ด ๋ฌธ์ œ๋ฅผ ์ด๋Ÿฐ ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„์—์„œ ํ•˜ํŠธ๋น„ํŠธ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ์—์„œ ์ด๋ฏธ ๋ฐœ์‹ ์ž๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
hbeat[socket.id] = Date.now();

ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ์–ด๋–ค hbeat ๊ฐ’์„ ๋ณด๋‚ด์•ผ ํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

socket.disconnect() ๋˜๋Š” socket.emit('disconnect') ๋Œ€์‹  ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ socket.close(); $๋ฅผ ์‹œ๋„ํ•˜๊ณ  ์„œ๋ฒ„ ์ธก์—์„œ 'disconnect' ์ด๋ฒคํŠธ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ์ผํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰