我想在客戶端斷開連接時(shí)重新和服務(wù)器建立連接。我在onClose里面這樣寫不行,要怎么寫才對?
[attach]363[/attach]
@walkor 重新連接成功了,onConnect有東西輸出,服務(wù)器端也收到消息,但是客戶端沒收到服務(wù)端發(fā)送的數(shù)據(jù)。正常情況下應(yīng)該是一直循環(huán)發(fā)送數(shù)據(jù)和接收數(shù)據(jù)吧
[attach]364[/attach]
服務(wù)端接收的數(shù)據(jù)
[attach]365[/attach]
服務(wù)端代碼
[attach]366[/attach]
我知道問題了,
onClose里面不能用定時(shí)器調(diào)用$con->connect()重連,因?yàn)槎〞r(shí)器是異步的,異步鏈接對象onClose時(shí)不立刻調(diào)用$con->connect()就會被workerman回收,異步鏈接的onMessage等回調(diào)都被回收了,所以沒作用。
定時(shí)重連只能重新new AsyncTcpConnection了。
如果不需要定時(shí)重連,可以在onClose里面直接$con->connect()
一般情況下,都不會 close 就立即重連吧,都會用定時(shí)器等個(gè)至少幾秒。因?yàn)槎鄶?shù)情況下由于服務(wù)端或者網(wǎng)絡(luò)不穩(wěn)定的斷開,就算立即重連也多半是失敗的。
在 onClose 里面添加的定時(shí)器中,創(chuàng)建新的 $connection 時(shí)重連時(shí)需要把整個(gè) onWorkerStart 里面創(chuàng)建 $connection 的部分都執(zhí)行一遍??梢园?onMessage, onClose, onError 三個(gè)寫成獨(dú)立的函數(shù),然后回調(diào)傳入函數(shù)名稱就行了。