我想在客戶端斷開連接時重新和服務(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里面不能用定時器調(diào)用$con->connect()重連,因為定時器是異步的,異步鏈接對象onClose時不立刻調(diào)用$con->connect()就會被workerman回收,異步鏈接的onMessage等回調(diào)都被回收了,所以沒作用。
定時重連只能重新new AsyncTcpConnection了。
如果不需要定時重連,可以在onClose里面直接$con->connect()
一般情況下,都不會 close 就立即重連吧,都會用定時器等個至少幾秒。因為多數(shù)情況下由于服務(wù)端或者網(wǎng)絡(luò)不穩(wěn)定的斷開,就算立即重連也多半是失敗的。
在 onClose 里面添加的定時器中,創(chuàng)建新的 $connection 時重連時需要把整個 onWorkerStart 里面創(chuàng)建 $connection 的部分都執(zhí)行一遍。可以把 onMessage, onClose, onError 三個寫成獨立的函數(shù),然后回調(diào)傳入函數(shù)名稱就行了。