階段性總結:unity3D客戶端和服務端

經過20天的加班加點,終於把最後的作業搞完了。

先說python服務端吧(因爲比較少),最重要的是一個socket的運用,其中我的遊戲中的信息儲存我用的json,服務端使用的是python2,客戶端使用的是C#嵌入到unity客戶端中。記錄以下幾個需要注意的點:

1.json文件的讀寫:

https://www.cnblogs.com/lpdeboke/p/11414254.html

2.json文件讀出來的全是unicode格式,loads之後需要轉爲utf-8再使用,但如果是與字符串判等,可以直接使用不需要decode。

3.數據沾包拆包:

https://www.cnblogs.com/guobaoyuan/p/6809447.html

裏面有兩種方案:第一種是添加一個延時,這樣在發送的時候,一段時間沒有更多的數據來,即使緩存中數據很少也會給發出去,這樣可以避免沾包,但是有一個無用延時。第二種就是老老實實拆包,數據包前面四個字節是此次發送數據的長度,根據這個長度去緩存中取數據,取不夠則等待下一段發過來,取剩的則是下一個數據包的。

4.自動獲取ip本機地址,這樣就不用每次自己手動去輸ip地址來連接啦。

python方法:https://cloud.tencent.com/developer/article/1571565

C#方法:https://blog.csdn.net/liulangdeyue/article/details/16832769

5.在發送過來的數據中解析數據時一定要注意取數據的邊界問題,比如後面是字符串,取少一個很容易就看得出來(print打印出來看看就解決了),但是在末尾取多一個情況就不一樣了,數據最後末尾全是\0(空白字符,即沒有,不是空格),print出來跟沒有\0顯示是一樣的,用list看得出來,但是一般我們都是直接print看看數據是什麼,不會先轉list再print,這個坑我踩了很久,“明明打印出來兩個字符串是一樣的,但是就是不相等,轉成相同格式也不行(從json中取出來默認是unicode,轉成utf-8的字符串再比較,其實不轉也不影響比較結果的,因爲字符串中每一個字符就只佔一個字節,跟unicode的儲存方式是一致的,但是如果是其他類型,比如int,就需要轉成utf-8再進行比較)”,中間使用了str.strip().strip(b'\x00'.decode())暫時解決了問題,參考地址https://blog.csdn.net/linglongbayinhe/article/details/86496341,其實根本原因在於取多了纔會出現\x00。

6.如果儲存的數據中含有中文,不要使用utf-8編碼,因爲utf-8有一部分中文沒有收錄進去,會產生亂碼。推薦含有中文使用GBK編碼。

7.數據存在中文時,寫入json中要指定ensure_ascii=False,否則中文在json文件中亂碼,還是屬於編碼問題。

8.打開文件時,模式選擇要注意,使用'r'模式時,文件不存在直接報錯,不會新建文件,使用'w'模式時文件不存在會新建文件。網上說'r+'會新建?但是我測試了貌似一樣報錯,穩妥起見,先使用os.exit判斷文件是否存在,不存在則使用'w'模式新建。

9.python使用socket發送數據時,如果直接發,默認是string格式,即socket.send(1),發送過去的是1這個字符,非二進制0001,使用bytearray解決這個問題,先把所有數據轉成byte放進list中(數字的話先轉成二進制,再一個個放進list中,字符串直接一個個放進list即可),最後直接bytearray(list)即可把list中所有的元素放到一個byte數組中,最後發送這個數組即可,當然你也可以每轉一個元素就bytearray一次,最後把所有bytearray發送。

10.以上說的轉成utf-8,因爲我本地默認是utf-8編碼,在文件頂部使用了# coding=utf-8,這時比如a = 1 ,這個1默認就是utf-8編碼的。轉換方法int(unicode.encode('utf-8'))。

11.判斷另一端斷開連接:

如果接收的數據長度爲0即表示另一端斷開了連接。

再說說C#客戶端:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章