我目前正在開發一個統一的遊戲,在單獨的項目中有一個服務器和一個客戶端,他們可以通過發送字符串通過tcp套接字很好地通信,但這不是一個非常有效發送遊戲數據的方式。我想知道是否以及如何通過套接字發送類和/或對象。如果不是,格式化和處理數據以發送並接收數據的最佳方式是什麼?Unity3D通過套接字服務器發送類 - 客戶端通信
回答
大多數使用稱爲「bitpacking」的東西以非常緊湊的方式將數據打包到流中。 它需要相當多的低級序列化和反序列化代碼,但可以帶來更好的吞吐量和帶寬使用。
快速谷歌搜索術語「位打包」應該給你所有你需要找到一種方法來解決問題。
這個概念涉及到使用二進制tcp套接字只發送原始數據值和沒有類型信息。
好處的典型例子... 浮點值「12345678.12345678」作爲一個字符串,它是大量的數據,使用位打包,你可以簡單地發送代表這個數字的4個字節。
JSON表示但將發出類似...
someMessage { myVar: 123f };
那是一個很大的數據說「對象X在其目前的方向移動23F」 通常是大多數做的是一樣的東西..
class Message
{
public int OpCode { get; set; }
public byte[] Message { get; set; }
}
然後編寫代碼將要發送的字節「打包」爲此類型。 OpCode然後被「前綴」到消息中,所以當數據通過線路時,接收器總是在前4個字節中獲得OpCode,而其他任何消息數據都是。
接下來的想法是,發送者和接收者共享類型,以及對OpCodes意味着什麼的一些理解,以便字節數組可以「打包」和「解壓縮」。
因此,在我上面的示例中,操作碼將是123,意思是「以當前速度以當前方向移動」,然後字節[]將包含4個字節(可能)用於對象ID,然後另一個4字節用於可以移動。
因此總共發送了12個字節。 而不是,(如果我可以刪除所有空白)在上面的例子中的24個字節,這與一個相對較小的圓數爲浮動值,這幾乎從來沒有發生! 作爲一個字符串發送一個float幾乎肯定會花費你大約20個字節爲一個典型的浮點值本身,因爲3D遊戲需要3個這樣的位置(x,y,z),這是一個12字節的選擇或60只是一部分消息發送的位置!
希望這應該讓你開始,如果沒有別的。
如果問題更關注一點,我會很樂意給出一個更完整的答案,但鑑於這本質上是一個非常廣泛的複雜問題,很難提供完整的解決方案。
我明白你在解釋什麼,它在我的待辦事項清單上。但我的問題是否有一種發送完整的類的方法,例如我有一個player.transform,併發送完整的類,如socket.send(player.transform),並在客戶端接收它作爲一個類喜歡它? –
- 1. 通過套接字客戶端服務器通信
- 2. 使用TCP通過套接字從服務器端發送ArrayList到客戶端
- 3. 通過套接字從客戶端發送字符串到服務器
- 4. 客戶端 - 客戶端通過服務器通信
- 5. 無法通過Python中的套接字進行客戶端 - 服務器通信
- 6. 客戶端通過套接字連接多臺服務器
- 7. 套接字通信,Java客戶端C服務器
- 8. Java服務器 - 客戶端套接字通信
- 9. 客戶端服務器套接字通信
- 10. 基於客戶端服務器套接字通信
- 11. 服務器 - 與套接字的客戶端通信Java
- 12. 套接字通信服務器/客戶端
- 13. 套接字編程。服務器客戶端通信
- 14. 從服務器到客戶端的套接字通信困難
- 15. 通過套接字發送多個變量從客戶端到服務器
- 16. Arduino客戶端通過套接字向Java服務器發送數據
- 17. Java客戶端/服務器通過套接字發送對象問題
- 18. 如何通過套接字發送int C++服務器/ Java客戶端
- 19. 通過套接字發送緩存的圖像從客戶端到服務器
- 20. JAVA套接字通信客戶端 - >服務器 - >客戶端
- 21. Java套接字服務器,C#套接字客戶端,通信問題?
- 22. 通過套接字傳輸文件客戶端服務器java
- 23. 無法通過套接字服務器獲取客戶端IP
- 24. java客戶端通過TCP連接與C++服務器通信
- 25. Java - 通過套接字發送文件(聊天客戶端 - >服務器 - >另一個聊天客戶端)
- 26. 通過TCP與c + +(套接字服務器)conect android(套接字客戶端)
- 27. 使用服務或IntentService的Android客戶端/服務器套接字通信
- 28. Java套接字。服務器端與客戶端通訊
- 29. WinSock2客戶端/服務器通信:發送和接收字符串
- 30. 向所有客戶端發送消息(客戶端 - 服務器通信)
http://msdn.microsoft.com/en-us/library/ms233843.aspx –
http://msdn.microsoft.com/en-us/library/system.runtime.serialization.formatters.binary.binaryformatter %28V = vs.110%29。aspx –
並以「C#二進制序列化」爲搜索結果 –