問題

今天才發現應該要有的一個小小設計,在使用SocketIO(或其他強連線函式庫)時,可能會希望連線後,立刻執行某條指令。
舉例來說,如果現在有兩台裝置(稱為AB),想用SocketIO進行對接,步驟為

  1. B已經連上Server,並有一組房間編號。
  2. A在線下取得B之編號
  3. A連上Server
  4. A知會Server房間編號。
  5. A知會B,”你好 拎北來阿。”

我一開始是4和5都直接塞在onConnection的時候,也就是一連上就執行。但是如果socketio斷線了,那重連的時候,5就會重複發送。也就是說B會再次看到”你好 拎北來阿。”

更多問題

解決問題的方法也很單純,就是把5從onConnection切開來,等連上後再執行即可。不過這邊就出現另一個問題,我怎麼知道SocketIO連上了?我一開始想用Listener解決,等連上後通知我該執行5的動作。但是這樣程式碼寫起來超不直覺。

明明應該是

1
2
1. socketIO 連上後知會房間編號
2. socketIO 拎北來阿

變成Listener的話就變成

1
2
1. socketIO 連上後知會房間編號, 再通知那個Call function的人我連上了。
2. 我接收到通知了,拎北來阿

怎麼樣都覺得第一種方法比較直觀容易理解。

用Queue解決

後來解決方法就是,做一個Queue蒐集沒Connect時的指令。所有沒Connect時的Message都會跑進這個Queue。等到Connect上後再把Queue裡的指令批次發送就好了。

這樣就可以繼續用

1
2
1. socketIO 連上後知會房間編號
2. socketIO 拎北來阿(這行可能尚未執行,放在Queue中等待連上時批次執行)

這樣的方式來寫Code了。