一个 websocket的wss的问题

因为断网了,我就回到游戏大厅了,连接上wifi后,想进子游戏,但进不去(也是连接不上),然后我就把游戏杀了,重点游戏图标,还是进不去,这个问题像是苹果系统问题,会短时间内主动把服务器域名拉黑

用了域名吧? 可能是 DNS 问题

是用了域名

:pray::pray::pray: 感谢 path发布出来了的话 需要怎么样搞?

看这里,自己先手动处理httpConnection的事吧
http://forum.cocos.com/t/httprequest-android/45905

我用了jsb.downloader替换getXMLHttpRequest 就是因为xhr 有问题 有时候 真是没办法

void WsThreadHelper::update(float dt)
{
/* Avoid locking if, in most cases, the queue is empty. This could be a little faster.
size() is not thread-safe, it might return a strange value, but it should be OK in our scenario.
*/
if (0 == _UIWsMessageQueue->size())
return;

// Returns quickly if no message
_UIWsMessageQueueMutex.lock();

if (0 == _UIWsMessageQueue->size())
{
    _UIWsMessageQueueMutex.unlock();
    return;
}

// Gets message
// Process all messages in the queue, in case it's piling up faster than being processed
std::list<WsMessage*> messages;
while (!_UIWsMessageQueue->empty()) {
    messages.push_back(_UIWsMessageQueue->front());
    _UIWsMessageQueue->pop_front();
}

_UIWsMessageQueueMutex.unlock();

for (auto msg : messages) {
    if (_ws)
    {
        _ws->onUIThreadReceiveMessage(msg);
    }
    CC_SAFE_DELETE(msg);
}

}

经常遇到在这行if (0 == _UIWsMessageQueue->size()) 嗝屁啊 直接闪退 有没有遇到的 怎么解决

@jiangtao_ye1 你是用creator么?
creator里面哪里有WsThreadHelper::update函数?

class WsThreadHelper
{
public:
    WsThreadHelper();
    ~WsThreadHelper();

    // Creates a new thread
    bool createWebSocketThread();
    // Quits websocket thread.
    void quitWebSocketThread();

    // Sends message to Cocos thread. It's needed to be invoked in Websocket thread.
    void sendMessageToCocosThread(const std::function<void()>& cb);

    // Sends message to Websocket thread. It's needs to be invoked in Cocos thread.
    void sendMessageToWebSocketThread(WsMessage *msg);

    // Waits the sub-thread (websocket thread) to exit,
    void joinWebSocketThread();

    void onSubThreadStarted();
    void onSubThreadLoop();
    void onSubThreadEnded();

protected:
    void wsThreadEntryFunc();
public:
    std::list<WsMessage*>* _subThreadWsMessageQueue;
    std::mutex   _subThreadWsMessageQueueMutex;
    std::thread* _subThreadInstance;
private:
    bool _needQuit;
};

不是Creator 是cocos-js3.9

版本很旧了,可以尝试升级一下WebSocket模块

兄弟,你这个问题解决了吗?目前一直到cocos creator 2.0.5还是存在这个问题

兄弟,你这个问题解决了吗

今天是2020年4月17日,关于websocket的问题依旧存在。
用cocos creator开发,版本是2.3.2,最新的。
现象1:用浏览器预览一切正常
现象2:用自带的模拟器,websocket无法连接
现象3:打包成原生android app,在手机上websocket无法连接。我用的是华为mate30
ios和windows桌面的没试过。

在论坛里搜索过其他人遇到的情况,能解决问题的方式总结一下是两种:
1、说是那个什么鬼default_protocol,搞不懂,不会弄
2、说是传递证书什么的,我的是nginx服务器,阿里云里购买的证书,只提供了两个,没有看一什么car什么的文件。
更何况,在客户端读取证书发送的服务器进行认证也不科学吧?
因为:
1、证书可能会经常换,至少会1年换一次吧,那么到时客户端也一年换一次?
2、微信小程序什么的,根本也不需要证书就能正常访问啊!

希望官方出来说一句,我希望的方式,就是一句 let ws = new WebSocket(“wss://xxxx”);能搞定,而不是什么let ws = new WebSocket(“wss://xxxxx”,“xxx”,“xxxx”);

拜托了!

证书买10年的

xi6.NET.ws = new WebSocket(xi6.websocket,[],cc.url.raw(“resources/thirteenyards.crt”));
[] 这里就是填写 default_protocol 必须和服务端一样 一般都是默认的 你那测试测试

example 里自带证书的范例看了吗?这个证书跟服务器是无关的,你直接拷过去就能用了。微信能直接用就是因为微信读取了手机系统的内置证书或者自带了一个证书。

证书复制官方项目中的证书,代码
var pemUrl = cc.url.raw(‘resources/ssl/cacert.pem’)
if(cc.loader.md5Pipe) {勾选了md5
pemUrl = cc.loader.md5Pipe.transformURL(pemUrl)
console.log(‘pemUrl’, pemUrl);
this.ws = new WebSocket(“wss://xxxxxx”, [],pemUrl);
} else {
this.ws = new WebSocket(“wss://xxxxxx”, []);
}
记得安卓打包的时候勾选nativesocket!还连不上给我蛋捏爆!

10赞

试了下!你的蛋保住了~

试了下,可以的

试了下确实可以。如果一直用咱们官方demo里的证书,会不会有过期的问题?或者这个证书是什么类型的,如何申请制作,有没有说明文档?新手还望指点一二。