V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
a302800411
V2EX  ›  问与答

关于 socket.io 消息丢失的问题

  •  2
     
  •   a302800411 · 2016-07-14 09:52:22 +08:00 · 5300 次点击
    这是一个创建于 3053 天前的主题,其中的信息可能已经有所发展或是发生改变。

    node.js+socket.io 运行在 localhost,客户端是 cocos2d-x 3.11 总共就运行了四个客户端,一个客户端广播消息后,服务器收到消息 broadcast 给其它三个客户端. 可是总会出现大概率的丢失消息,大概十次有五次会丢失消息. 这要是网络质量不好我也就不说什么了,虽说 scoket 是不可靠的连接,但运行在本地这个消息丢失率也太高了吧.. 各位能不能帮分析一下可能的原因

    14 条回复    2017-09-06 12:28:33 +08:00
    scys
        1
    scys  
       2016-07-14 10:23:00 +08:00
    感觉是因为逻辑原因问题,而且楼主,你起码给个演示代码,否则你想问啥?
    现在我用 golang 的 websocket 没试过丢消息,可是链接会断,可是你 4 个客户端,就真心感觉是代码逻辑问题了。
    a302800411
        2
    a302800411  
    OP
       2016-07-14 10:34:36 +08:00
    @scys 逻辑很简单...
    // 客户端 1 发送消息
    _sioClient->emit("serverController", buffer.GetString());
    // 服务器收到消息并且广播(确定收到了消息 控制台打印出来了)
    socket.on('serverController',
    function (strJson) {
    socket.broadcast.in (room).emit('clientController', strJson); //广播消息
    });
    // 客户端 2 3 4 有相同的监听器
    void PlayingSence::clientController(cocos2d::network::SIOClient *client,const std::string& data){
    //收到消息会打印出来
    }
    结果就是客户端 2,3,4 运气好的时候全部能收到消息..运气不好的时候只有一个能收到
    scys
        3
    scys  
       2016-07-14 10:43:43 +08:00
    看看链接是不是断开了,如果代码如此简单,就只能是你的网络环境有问题。
    a302800411
        4
    a302800411  
    OP
       2016-07-14 12:14:01 +08:00 via Android
    @scys 连接没断,网络是运行在本机啊,控制台打印了 connecting 和消息长度,然后就没然后了。。。 delegate 能不能收到完全靠缘分
    laoyur
        5
    laoyur  
       2016-07-14 12:18:09 +08:00
    看楼主用的东西,干嘛不直接用 Pomelo ?当然好久没关注 Pomelo ,不晓得发展到啥情况了
    morethansean
        6
    morethansean  
       2016-07-14 12:19:04 +08:00
    你的 socket 是走 udp 的?
    a302800411
        7
    a302800411  
    OP
       2016-07-14 13:52:34 +08:00
    @morethansean 应该不是 udp...我查了一下 socket.io 大部分都是用的 websocket, 然后 websocket 走的是 tcp
    现在很尴尬的是,客户端的日志文件里,可以收到心跳包,可以收到我广播的消息的 length,但是就是收不到消息内容...
    我有点凌乱 不知道为什么了
    ETiV
        8
    ETiV  
       2016-07-14 14:44:23 +08:00 via iPhone
    服务端和客户端协议不一样?
    ETiV
        9
    ETiV  
       2016-07-14 14:45:04 +08:00 via iPhone
    客户端开 wireshark 或者 tcpdump 看吧……
    morethansean
        10
    morethansean  
       2016-07-14 17:17:54 +08:00
    @a302800411 tcp 肯定是可靠的啊……
    a302800411
        11
    a302800411  
    OP
       2016-07-14 17:19:41 +08:00
    @morethansean 所以我很迷..消息为什么丢失...丢失的毫无规律..
    BOYPT
        12
    BOYPT  
       2016-07-14 17:26:57 +08:00
    可能要抓包分析看看,这样看不出问题
    a302800411
        13
    a302800411  
    OP
       2016-07-16 17:36:56 +08:00   ❤️ 1
    @scys
    @morethansean
    @ETiV
    @BOYPT

    我在 Cocos2d-x 的源码里打了断点,发现客户端是成功接收的,但是 在 throw 给 cocos thread 的后,就有一定概率丢失..
    因为不是每次都必现,所以调试起来很头疼...
    hatancb
        14
    hatancb  
       2017-09-06 12:28:33 +08:00
    @a302800411

    楼主 node.js+socket.io 消息丢失问题后来怎么处理的
    我们也碰到同样的问题了,消息会小概率丢失。。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2672 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 14:57 · PVG 22:57 · LAX 06:57 · JFK 09:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.