[英]how can I transfer large data over tcp socket
如何在不拆分的情況下傳輸大數據。 我正在使用 tcp 套接字。 它的游戲。 我不能使用 udp,數組中可能有 1200 個值。 我正在以 json 格式發送數組。 但是服務器接收它就像分裂一樣。
還有什么選項可以像tcp一樣發送http請求? 我需要按順序回復。 它也應該更快。
謝謝,
你不能。
這里沒有問題需要解決。
您對拆分數據包/數據報沒有太多控制權。 網絡決定了這一點。
在 IP 的情況下,您有 DF(不分段)標志,但我懷疑它在這里會有多大幫助。 如果您通過以太網進行通信,那么 1200 個元素的陣列可能不適合以太網幀(有效負載大小高達 1500 個八位字節的 MTU)。
為什么您的應用程序依賴於整個數據必須在單個單元中而不是在單個連接(可能由多個單元組成)中到達這一事實?
考慮問題可能出在其他地方或您可能發送過多不必要數據的想法。 在 PHP 示例中,有isset()
函數。 如果您正在創建基於互聯網的回合制游戲,則不需要(每次都需要來回發送所有 1,200 個變量。只需發送更改的內容,當其他玩家收到該數據時,僅更改設置的變量。
如何在不拆分的情況下傳輸大數據。
我將上述解釋大致等同於“如何使用盡可能少的 TCP 數據包通過 TCP 連接傳輸我的數據”。 正如其他人所指出的,無法保證您的數據將被放入單個 TCP 數據包中——但您可以做一些事情來使其更有可能。 以下是我會做的一些事情:
請注意,即使在您完成上述所有操作之后,TCP 層有時仍會將您的消息傳播到多個數據包等中——這就是 TCP 的工作方式。 即使您的本地 TCP 堆棧從未這樣做,接收計算機的 TCP 堆棧有時仍會將來自連續 TCP 數據包的數據合並到其接收緩沖區中。 所以接收程序有時總是會“像拆分一樣接收”,因為 TCP 是基於流的協議,不維護消息邊界。 (如果你想要消息邊界,你必須自己做幀——最簡單的方法通常是在每條消息之前發送一個固定大小(例如 1、2 或 4 字節)的整數字節計數字段,所以接收方知道在解析完整消息之前需要讀入多少字節)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.