socket io

socket io 在浏览器运行正常,在模拟器运行不正常是什么情况?

这个很正常。

那是如何解决啊?请教你一下

你都不说 如何不正常 。怎么解决?

论坛搜一下吧,或者直接用 WebSocket

现在项目都快上线了,现在改WebSocket 有点来不及,使用socket.io 在浏览器上数据收发都是正常的,换成原生的模拟器就收不到服务器发送的消息了,这个问题比较蛋疼,官方也没有详细的文档解释,是cocos creator 底层封装socket屏蔽掉了吗?网上很多人都遇到过这个问题,但没有人解决的

底层的 socket io 是网友做的,版本很老了,没有人维护

你最起码得把收发信息部份的代码贴出来看看吧?

服务器socket.io版本太高?我的太高也接收不到,现在貌似是1.4(没问题了,以前服务器的socket.io版本2.0+),还有一个问题,服务器发来的data原生设备上会转成json,web没问题。

1赞

做后才发现是cocos 的socket 版本和服务器的版本不一致,后来自己弄了一个心跳包解决了问题

1赞

大兄弟,想问下,你那个是怎么解决的呀,多谢了

我遇到类似的问题,用socket.io,浏览器一切正常,但是android真机跑的时候,第一次会特别慢,有的时候甚至连不上,重新连就好了,请问下又遇到这种情况的么?

这个问题我花了好长时间,终于发现是什么原因了,在此记录,以备后来者备忘; 模拟器中调用socket.io,实际上是通过js-binding技术,通过jsb_socketio.cpp这个中间桥调用最终的c++代码,SocketIO.cpp这个文件来实现的。查看源代码,如下所示:

void SIOClientImpl::handshake()
{
    CCLOGINFO("SIOClientImpl::handshake()");

    std::stringstream pre;
    // pre << "http://" << _uri << "/socket.io/1/?EIO=2&transport=polling&b64=true";

这个请求path,在程序中写死了:/socket.io/1,而我们后端服务器开发时,一般基本上都是默认值socket.io,所以导致模拟器中发出的请求,服务器端无法接收。

解决方法:1)服务器端设置请求path为:/socket.io/1 2)客户端增加连接参数:path:’/socket.io/1’

1赞

服务端增加请求path我理解了,但是客户端现在代码不是已经是写死了/socket.io/1了么?还需要加什么连接参数?是否可以说明具体一点?谢谢。

io.connect(‘地址’,{path:’/socket.io/1’} ,如果不加后面的path,默认是socket.io,这保证你在web上运行时没有问题,实际上这个参数,对模拟器应该是无效的,因为模拟器中用的c++代码中实际上是写死了这个路径。 其实主要就是保证服务器上的路径是 /socket.io/1;

PS:没明白引擎这边为何采用这种方式,难道是因为c++的效率高?为何不能与web一样,直接使用socketio的js包呢??

目前客户端的代码只支持namespace,不支持path,除非自己改代码

了解。我先记录一下,后续跟进。
https://github.com/cocos2d/cocos2d-x/issues/18099

欢迎提交补丁啊。

支持的啊。我刚测试通过了的。

还有一个问题,就是参数中的b64=true,我用netty做后端时,它是解析数字(导致报错),我不知道标准协议应该是什么,我觉得是不是应该 b64=1 ?? 另外,这个EIO=2,我在web上运行时,它发出的请求是EIO=3,不知道这有什么区别??