๋ด ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๊ณ ๊ฐ ์ ์ฅ์์
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() ๋ฉ์๋๊ฐ ์๋ํ์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
๋ด๊ฐ ํ ์คํธ ํ ํ ์ ์๋ํฉ๋๋ค. ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ์ฌํํ ์ ์์ต๋๊น?
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()
์์ ์คํํ ๋ ์ด๋ฒคํธ๋ฅผ ๋น๊ตํ๊ฒ ์ต๋๋ค.
newMessage
:- ํน์ ๋ฐฉ์ ๋ฉ์์ง๋ฅผ ๋ธ๋ก๋์บ์คํธํฉ๋๋ค.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'
์ด๋ฒคํธ๋ฅผ ํธ๋ฆฌ๊ฑฐํด์ผ ํฉ๋๋ค. ๊ทธ๊ฒ์ ๋๋ฅผ ์ํด ์ผํ์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋น์ ์ ๋ฐ๋ณด์ ๋๊น? ํด๋ผ์ด์ธํธ์์๋ ๋ฐฉ์ถ์ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ง๋ง ์๋ฒ์์๋ ๋ฐฉ์ถํ์ง ์์ต๋๋ค. ์ฌ๊ธฐ์ ๊บผ์ ธ