今天總算是修復了好了所有bug,所有bug都是出現在Go編寫的服務端,居然沒有Rust的比較神奇。經過昨天的痛苦測試,今天我編寫了一個echo服務器來專門測試這種網絡軟件,效果可以說是還算不錯,很快就能定位問題大概是出現在服務端還是客戶端哪裡的問題。

第一個Bug是出現的情況是服務端編碼正常,客戶端編碼解碼正常,但是最後服務端解碼不正常,當時我調試的時候發現明明只有三個字節的數據,回顯的時候居然返回了一大塊,估計有幾萬個字符。最後找到原因是我沒有指定slice讀到的字符的數量…可以說是智商問題了。

第二個Bug就非常神奇了,開始軟件可以正常運行,但是大概多訪問幾個網頁之後就開始無法使用了。通過回顯服務器又發現這個問題又出在服務端的解碼階段???最開始解碼是正常的,後面我發現解碼器的nonce被突然改變了,被全填成了0,這就很奇怪了,默認我設置的編碼器只有一個設置nonce字段的函數,不可能會有別的地方調用,仔細觀察還發現是每次客戶端發送心跳包的時候nonce才會被改變。我撓頭頓足搗鼓了幾個小時都不知道原因,後面看到nonce的切片的cap是62,才隱隱約約察覺到nonce可能是被修改了引用,go這個語言slice變量實際上是一個指針,賦值是不會拷貝的,而62這個數字正好是我設計客戶端和服務器端交互協議數據字段的長度。後面我把設置nonce字段的方法改成了copy的邏輯,算是解決了。

相比之下Rust就省心不少,但是我寫Rust的速度太慢了…寫一句代碼都得看好幾次文檔。