如何在客户端关闭套接字连接?
我正在使用:
即:
致电localhost/test
- 服务器端
var test = io
.of('/test')
.on('connection', function (socket) {
console.log('open socket: ' + socket);
socket.on('disconnect', function () {
console.log('disconnected event');
//socket.manager.onClientDisconnect(socket.id); --> endless loop with this disconnect event on server side
//socket.disconnect(); --> same here
});
});
- 客户端
var socket = io.connect('http://localhost:3000/test');
socket.on('disconnect', function () {
console.log('disconnect client event....');
});
socket.emit('getInitData', function (data) {
.. do something with data
});
如果我加载测试页面,我需要来自服务器的一些值(getInitData) 在第一页访问我获取数据一次,在重新加载或第二次访问我得到它两次,依此类推。
如果您离开页面,服务器端的连接将在页面重新加载时自动关闭 但在客户端,连接仍然是开放的 如何在客户端关闭连接或检查是否已打开连接?
更新
我现在尝试了以下内容:(客户端)
window.onbeforeunload = function(e) {
socket.disconnect();
};
这会在客户端触发disconnect事件,但我仍然会得到两次或三次响应。
答案 0 :(得分:65)
你有没有尝试过:
socket.disconnect()
在客户端?
答案 1 :(得分:17)
对于socket.io版本1.4.5:
在服务器上:
socket.on('end', function (){
socket.disconnect(0);
});
在客户端:
var io = io();
io.emit('end');
答案 2 :(得分:9)
服务器端和/或浏览器端没有连接。只有一个连接。如果其中一方将其关闭,则它将被关闭(并且您无法将数据推送到显然已关闭的连接)。
现在,当您离开页面时,浏览器会关闭连接(它不依赖于您在服务器端使用的库/语言/操作系统)。对于WebSockets来说,这至少是正确的(由于keep-alive
长期轮询可能不适用,但希望socket.io正确处理此问题。)
如果出现这样的问题,那么我很确定你自己的代码中有一个错误(在服务器端)。可能你正在堆叠一些不应该使用的事件处理程序。
答案 3 :(得分:7)
socket.disconnect()
仅在客户端重新启动连接触发断开连接事件。但又重新联系了。
socket.close()
断开与客户端的连接。客户端将继续尝试连接。
答案 4 :(得分:2)
我试图在版本1.0中关闭用户连接并找到此方法:
socket.conn.close()
此方法与disconnect()的区别在于客户端将继续尝试重新连接到服务器。
答案 5 :(得分:1)
socket.disconnect()
是socket.close()
的同义词,它们手动断开套接字。
在客户端输入时:
const socket = io('http://localhost');
这将打开与autoConnect: true
的连接,因此当您从服务器断开套接字时,lib将尝试再次重新连接,以禁用自动连接:
const socket = io('http://localhost', {autoConnect: false});
socket.open();// synonym to socket.connect()
如果需要,您可以手动重新连接:
socket.on('disconnect', () => {
socket.open();
});
答案 6 :(得分:0)
尝试此操作以关闭连接:
socket.close();
如果你想再次打开它:
socket.connect();
答案 7 :(得分:0)
通过从客户端发出任何事件,只需在服务器端尝试function ai(message){
if (username.length<3){
username = message;
send_message("Nice to meet you " + username + ", how are you today?");
responsiveVoice.speak("Nice to meet you " + username + ", how are you today?");
}
if (message.toLowerCase().indexOf("how are you")>=0){
send_message("Thanks, Iam good!");
responsiveVoice.speak("Thanks, Iam good!");
}
if (message.toLowerCase().indexOf("time")>=0){
var date = new Date();
var h = date.getHours();
var m = date.getMinutes();
send_message("Current time is "+h+":"+m);
}
if (message.toLowerCase().indexOf("thanks")>=0){
send_message("You are welcome");
}
if (message.toLowerCase().indexOf("Thank you")>=0){
send_message("No Problem");
}
if (message.toLowerCase().indexOf("thank you very much")>=0){
send_message("Welcome Sir!");
}
}
。