在小程序中,通常來說websocket的連接直接按照官方微信開放文檔來做就好,不是什么難點(diǎn)。但是當(dāng)小程序不僅一個socket連接時,就會出現(xiàn)一些問題:
比如,我一開始寫了一個websocket連接,用來發(fā)送圖片,但是后來,項(xiàng)目開發(fā)伙伴在上面增加了mqtt部分,在這種時候,一旦運(yùn)行微信小程序就會出現(xiàn)一些問題--比如我這里遇到的問題就是它連接到server端之后就自己斷開,無法發(fā)送/接受數(shù)據(jù)。
一開始是這樣寫的:
wx.connectSocket({
url: 'ws://(...)',
success(){
console.log("成功")
},
fail(){
console.log("失敗")
},
complete(){
console.log("完成");
}
})
wx.onSocketOpen(function (res) {
console.log('WebSocket連接已打開!')
wx.sendSocketMessage({
data:'HelloWorld:'
})
})
wx.onSocketError(function(res){
console.log('WebSocket連接打開失敗,請檢查!')
})
wx.onSocketMessage(function (res) {
console.log(res)
})
wx.onSocketClose(function (res) {
console.log('WebSocket連接已關(guān)閉!')
})
},
解決辦法:
var pagethis = this;//存一下“this”
console.log('準(zhǔn)備連接')
pagethis.data.localSocket=wx.connectSocket({
url: '...',
}),
pagethis.data.localSocket.onOpen(function(res){
console.log('WebSocket連接已打開!')
if (pagethis.data.localSocket.readyState === 1){
pagethis.data.localSocket.send({
data: 'hw'
})
}
}),
pagethis.data.localSocket.onMessage(function(res){
console.log(res)
pagethis.data.localSocket.close()
})
//監(jiān)聽該次websocket是否關(guān)閉
pagethis.data.localSocket.onClose(function (res) {
console.log('WebSocket連接已關(guān)閉!')
})
這樣修改之后,這里的websocket面對的就只是我們要連接的websocket了,而并非是這個這個小程序要面對的所有socket。
而且,在這里我在注意到一點(diǎn),wx.closeSocket()[修改過的程序中的pagethis.data.localSocket.close()函數(shù)]函數(shù)不能拎出來用,否則會有警告/報(bào)錯,因?yàn)閱为?dú)拎出來后,要close就得先確認(rèn)open,一般加在發(fā)送函數(shù)或者接收數(shù)據(jù)函數(shù)那里。

close警告.png
如何確認(rèn)小程序是連接上,然后出現(xiàn)問題;而不是一開始就沒有連接上-->
查看網(wǎng)絡(luò)請求:

network.jpg
查看左側(cè)打馬賽克部分有無出現(xiàn)目標(biāo)地址。