WEBSOCK/TCP/UDP 網路連線處理建議
今天到討論區看到一篇使用 TCP / UDP 做遊戲的文章,看樓主應該是剛學會,趕緊以過來人的身分提供一些建議,不然等程式龐大了再來考慮應該就懶了 😂
下面是提供的一些建議
- 現在很多用戶都是透過分享器連接上網,所以基本上取得的IP是分享器那一台的IP。如果單純使用 TCP 或 UDP 會有一些問題,例如:
- 分享器實際IP 外網 200.100.100.100。
- 用戶端連接分享器取得的IP 為內網 192.168.0.1。
- 結果為用戶端可以送到主機,主機無法傳送到用戶端。
- 如果用戶端有實際對外IP,仍然需要考慮到防火牆會阻擋 Port 的問題。
- 現有網路架構可參考 singalR、websocket 這兩種方法。
- 先寫好主機端程式,所有用戶端皆傳送資料到主機,再由主機發送到各用戶端,主機有對外IP讓客戶連接即可。
- 用戶端連接主機後,將建立連線,可跨過內網限制。
- 因為使用 web (Port:80/443) 基本上可穿過本地防火牆。
- 樓主也可以寫一個GM程式,監控時再連到主機。
- 樓主已會使用 TCP / UDP,建議使用 websocket 連線,因為用法差不多。
- Google搜尋 websocket 可以找到一堆範例。
後續還有一些要考慮的,不管使用WEBSOCKET / TCP / UDP 實際連線到外網最常遇到的狀況就是網路阻塞,例如傳送端傳送 [12345] 跟[ABCDE] 兩封訊息,而接收端會收到的狀況會如下
- 接收到正常的 [12345] 兩封 [ABCDE]
- 接收到的為 [12345][ABCDE] 一封訊息
- 接收到的為 [12345][AB , CDE] 兩封不完全訊息
我的處理方式大致如下
- 使用開頭即結尾識別碼,例如\s跟\e
- 接收端只處理\s \e區間的資料
- 以上面第3.來說會接收到 \s[12345]\e\s[AB , CDE]\e 兩封,實際處理起來會分段為
- 接收到 \s[12345]\e\s[AB 先處理 \s[12345]\e 保留 \s[AB
- 累加之後接收到 CDE]\e => \s[ABCDE]\e
- 再處理 \s[ABCDE]\e
其實網路處理說簡單真的也不難,可是就是那種遇到奇怪的問題就要找老半天,真的要靠乖乖才行了😂
留言
張貼留言