【问题标题】:socket.io client connect disconnectsocket.io 客户端连接断开
【发布时间】:2015-05-19 16:27:03
【问题描述】:

我无法弄清楚为什么多次断开/连接 socket.io 连接不起作用?

服务器端代码:

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

客户端代码:

var socket = io();
socket.on('connect', function() {
    console.log("connected from the client side");
});
$('#connect_button').click(function(){
    socket.connect();
});
$('#disconnect_button').click(function(){
    socket.disconnect();
});

它可以断开连接。但不会重新连接。我正在使用 Socket.io 1.0。请帮忙。

【问题讨论】:

  • 你的例子对我有用。
  • 它工作一次。但它会工作很多次吗?它不适合我。我猜测 socket.id 发生了变化,然后断开连接不再与新连接的 socket.id 关联。只是一个猜测:-)

标签: node.js socket.io socket.io-1.0


【解决方案1】:

你在客户端试过这个配置吗?

// 0.9  socket.io version
io.connect(SERVER_IP, {'force new connection': true});

// 1.0 socket.io version
io.connect(SERVER_IP, {'forceNew': true});

【讨论】:

  • 我又试了一次,现在可以了。我将发布工作代码 - 它可能对其他人有所帮助。
  • 谢谢@jujuleder!你知道这些 io.connect 配置的文档在哪里吗?我在任何地方都找不到。
  • 另外值得注意的是,您不需要指定 SERVER_IP。 io.connect({'forceNew':true}); 将默认使用根 url。
  • 非常感谢您的回答,这正是我想要的!看在上帝的份上,我花了大约 3 个小时阅读我的​​角度服务/工厂/范围,试图找出我做错了什么。我不习惯 socket.io 的文档风格。
【解决方案2】:

此解决方案基于 Jujuleder 的回答有效。显然在 socket.io 1.0 中,它是“forceNew”而不是“force new connection”——虽然两者都有效。

服务器:

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);

app.get('/', function(req, res){
    res.sendfile('s.html');
});

io.on('connection', function(socket){
    console.log('a user connected: ' + socket.id);
    socket.on('disconnect', function(){
        console.log( socket.name + ' has disconnected from the chat.' + socket.id);
    });
    socket.on('join', function (name) {
        socket.name = name;
        console.log(socket.name + ' joined the chat.');
    });
});

http.listen(3000, function(){
    console.log('listening on *:3000');
});

客户端(s.html):

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>button{width: 100px;}input{width: 300px;}</style>
</head>
<body>

<ul id="messages"></ul>

<button id="disconnect">disconnect</button>
<button id="connect">connect</button>

<script src="/socket.io/socket.io.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script>

    var socket = io.connect('http://localhost:3000');

    $('#disconnect').click(function(){
        socket.disconnect();
    });
    $('#connect').click(function(){
//        socket.socket.reconnect();
//        socket = io.connect('http://localhost:3000',{'force new connection':true });
        socket = io.connect('http://localhost:3000',{'forceNew':true });
        socket.on('connect', function(msg){
            socket.emit('join', prompt('your name?'));
        });
    });
    socket.on('connect', function(msg){
        socket.emit('join', prompt('your name?'));
    });
    socket.on("disconnect", function(){
        console.log("client disconnected from server");
    });

</script>
</body>
</html>

【讨论】:

  • 我们不要开始处理产生双套接字连接的单个浏览器请求。我已经和那个 bug 和平相处了。
  • 新连接不能处理之前的监听事件吗?我有必要向套接字连接添加新的侦听器吗?
  • @KayaToast 如何解决这个问题?
猜你喜欢
  • 2017-07-17
  • 2012-05-17
  • 1970-01-01
  • 2014-12-16
  • 2015-11-21
  • 2012-10-12
  • 2015-07-28
  • 1970-01-01
  • 2021-07-22
相关资源
最近更新 更多