關於使用TCP或者其他鏈結方式時資料接收問題

2021-06-20 02:35:38 字數 2299 閱讀 3706

12月29號我基本寫完了這次**伺服器的**並正式掛到外網測試。說說在這次編寫**中遇見的問題和總結一下自己的想法。

這次的功能要求不是很難,應該說是很簡單的哪一種,基本上是邏輯理清楚了然後就可以一路寫下去的那種。但是後來還是用了六個星期左右才將它完成。其最主要原因我個人認為還是歸結與我自己對tcp/ip通訊的不熟悉,還有就是在做的前期沒有和相關人員討論要用到的東西,以及自己對通訊邏輯處理的錯誤思想。

在拿到策劃書的那個星期,邏輯**就寫完了,很快的。前前後後加起來大概1200行**左右。不是很多,用的都是很基礎的知識。完了之後就一直在搞通訊這塊,首先是使用開源的raknet來和資料伺服器進行資料的交換和認證,然後是和client的資料交換。看起來是很簡單的。但是,就這一塊,弄了近五個周。

由於沒有用過這個raknet的開源**,主程這邊就直接給我乙個可用的現成**。看了一下,不是很難,就是寫了一些基本的東西。包括超時的處理,還有連線,斷開,檢測是否連線,建立位元組流等。然後,我直接在這個基礎上修改和新增了關於位元組流的建立的一些方法。這個部分做的不是很快,也用了乙個周左右。但是由於留在這裡的乙個小小的問題,導致了我後來除錯了很久,這個待會再說。

和dcs通訊完成之後,就開始和client通訊。很丟臉的說,這個**也不是我的,是主程給的。使用的是tcp協議進行的通訊。這邊剛開始主程說用按照公司的要求來弄,所有的通訊必須加上頭部位元組流,這個頭部位元組流就是公司自己定義的一些東西。但是後來不知道為什麼client那邊接收不正常,公司兩個寫伺服器的都沒能解決,後來就果斷換了一種方式,不要頭部,結果就正常了。我不明白這是為什麼,但是有時間我回去寫個dome看看。這樣看起來似乎整個專案就完了,至少我當時是這樣想的。

接下來開始測試,測試那邊出來乙個問題,說什麼兩個client同時連線伺服器就會得到的相同的資料。後來一查,是隨機種子的原因。關於這個上次寫了一下記錄。然後解決了。然後測試那邊好像就沒有問題了。這樣似乎就驗證了我的想法,專案完成了。

但是,悲劇才是剛剛開始。首先來的是,公司組織多人測試的時候發現資料的接收是不對的,a和b同時鏈結伺服器,a可能收到b的資料,也就是資料開始交竄開來。這也就是說我的通訊邏輯有問題。一查,果然是這樣。剛開始我設計的時候想的是並行鏈結,但是設計出來時序列鏈結,也就是說client傳送請求道我的server,然後我請求和dcs鏈結驗證使用者訊息,然後自身邏輯處理,完了後就再次給dcs通訊同步資料。然後dcs返回同步資料的結果。收到結果後,我這邊才會返回資料給client。這個邏輯裡面有個很大的問題就是當多個使用者同時請求資料的時候,伺服器時不能夠正確識別使用者的。後來就修改這個邏輯,首先將接收dcs的資料的**分開,讓各自接收各自的資料。並且在tcp中將接受的使用者資訊用map存起來,然後在dcs資料返回來並且邏輯處理後的結果在map中查詢並返回給client。這樣基本上就解決了資料的交竄。

給張圖,說明一下:

按照1237456這是剛開始的邏輯

這是改過來後的邏輯。

1237546,說一下改變了什麼,可能很明顯的是,這個改法就是不在等待dcs返回的來資訊了.邏輯處理完後把結果返回dcs儲存後直接傳送給clinet。這裡面還有乙個東西沒有畫出來,就是關於tcp的處理。以前是一路到底,現在是分開處理。tcp接收資料和傳送資料分開來處理。傳送資料傳送完就結束了,然後while迴圈裡一直去執行傳送資料的函式,只要一段檢測到有資料從邏輯返回來就傳送出去。這樣的就可以避免資料交竄。

但是還記得上面說過遇見的問題嗎?關於raknet等所有資料改好了才發現資料的傳送總是超時,有時候只會超時乙個連線,有時候所有連線都會超時。後來列印日誌出來才發現問題出現在raknet的資料流接收上面。那個上面是按照以前序列的**來寫的,每次接收資料要判斷後都要睡眠2s的時間。這個**明顯在使用並行的時候不適用。

在這裡順便吐槽一下,測試的時候我問ta有什麼問題沒有,他說沒有。好,那就沒有。然後再測試的時候問題又出來了。我去這前前後後浪費了我好幾天的時間。既然問題出來了那就改吧,改完測試,又沒有問題,我還忒別問了一下說這這會真沒有問題了吧。最後在一次大規模測試的時候問題又出來了。這前後又是幾天,我真心不想說什麼的了。我承認**有問題是我的問題,但是你們的測試讓我號蛋疼。這樣導致專案進度那個拖的是一塌糊塗啊。

這樣整個專案才完成。歷時6個星期。說說我的感受吧,以前在學校以為tcp/ip不是很重要的,只要學好桌面程式設計就好了。現在看來你當時的想法太沒有前瞻性了。如果不能和使用者互動,桌面的軟體寫的再好也是白搭,尤其是像現在自己在寫伺服器的情況下。最近這段時間也在努力的補習通訊原理,希望能夠快點補起來吧。還有就是在寫東西之前一定要和互動的物件商量好互動的協議,這點很重要啊。

oracle中使用單引號或者其他特殊字元處理方法

start 字串是用單引號括起來的,如果想在字串中輸入單引號該怎麼辦呢?有兩種方法。方法一 是用兩個單引號代表乙個單引號 select i m mixika99 from dual 方法二 使用 oracle 特殊語法 select q i m mixika99 from dual 事實上,我們可以...

使用get或者post方式資料互動

採用get或者post方式在不同伺服器中傳送資料例如 www.baidu.com?type 123 num 34567 獲取方式 asp private requestdata getrequestdata else 傳送方式 asp 在傳送的時候還可以對資料採用演算法加密 例如採用md5 將資料附...

axios02 其他使用方式 推薦

1.學習目標介紹 axios其他使用方式 2.學習路線 1 複習上一小節介紹的兩種方式 axios.get then axios.post then 2 介紹第三種使用方式 基本使用button btn2 點我傳送get請求button btn3 點我傳送post請求button src axios...