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,不知道这有什么区别??

看源码,的确是b64=1。
如果为b64=true,服务端会出现什么错误么?
EIO的意思是:engineio的protocol版本号,因为js的socketio依赖了一个内部模块叫engineio的玩意。
客户端发送的这个版本号应该会影响服务端的一些版本差异的处理行为。

还是请官方重新绑定一下SOCKETIO吧,两边不一样用起来很不方便,而且问题也比较多

后续会跟进重点解决一下这个问题。目前有两套方案:

  1. 重写socketio的cpp绑定层,实现跟socketio js版本一样的逻辑。
  2. 废弃socketio绑定,直接使用socketio js版本。

这个问题解决了吗?我这里也是报一样的错。我的cocoscreator是1.6.1版本的,后端是nettysocketio这个框架,浏览器上socket连接正常,模拟器中,报错。我记录下了两个请求的差异。

浏览器下:
HttpObjectAggregator$AggregatedFullHttpRequest(decodeResult: success, version: HTTP/1.1, content: CompositeByteBuf(ridx: 0, widx: 0, cap: 0, components=0))
GET /socket.io/?EIO=3&transport=polling&t=Lz_bf-w HTTP/1.1
Host: 127.0.0.1:9081
Connection: keep-alive
Origin: http://localhost:7456
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36
Accept: /
Referer: http://localhost:7456/
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.8
Cookie: io=4e6b2361-801f-499b-9721-9576b086dc6e
content-length: 0

模拟器中:
HttpObjectAggregator$AggregatedFullHttpRequest(decodeResult: success, version: HTTP/1.1, content: CompositeByteBuf(ridx: 0, widx: 0, cap: 0, components=0))
GET /socket.io/1/?EIO=2&transport=polling&b64=true HTTP/1.1
Host: 127.0.0.1:9081
Accept: /
Cookie: JSESSIONID=F671186BE09C475E6AF2300629B77AE4
User-Agent: beimi-mobile/1.0 CFNetwork/811.4.18 Darwin/16.6.0
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: keep-alive
content-length: 0