Node.js:socket.io关闭客户端连接

时间:2013-08-08 12:57:47

标签: javascript node.js express socket.io

如何在客户端关闭套接字连接?

我正在使用:

  • socket.io 0.9
  • node.js 0.10.15
  • express 3.3.4

即: 致电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事件,但我仍然会得到两次或三次响应。

8 个答案:

答案 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!"); } }