2016-02-15 192 views
1

我一直在使用套接字tcp連接到遊戲服務器。這裏最大的問題在於遊戲服務器沒有任何分隔符發送數據 - 因爲它將數據包長度發送到數據中 - 使得無法使用socket:receive(「* a」)或「* l」。從服務器收到的數據不具有靜態大小,並以HEX格式發送。我使用此解決方案:從lua tcp socket接收沒有數據大小的數據

while true do 
    local rect, r, st = socket.select({_S.sockets.main, _S.sockets.bulle}, nil, 0.2) 
    for i, con in ipairs(rect) do 
     resp, err, part = con:receive(1) 
     if resp ~= nil then 
      dataRecv = dataRecv..resp 
     end 
    end 
end 

正如你看到的,我只能通過讀取一個字節並將其附加到一個字符串,而不是一個很好的方式得到從插座中的所有數據,因爲我有兩個套接字讀。有沒有更好的方式從這個套接字接收數據?

回答

2

我不認爲有任何其他的選擇;通常在這種情況下,客戶端會讀取特定長度的數據包,以確定需要從數據流的其餘部分讀取多少數據。有些協議結合了新線和長度;例如HTTP使用行分隔符作爲標題,其中一個標題指定了標題之後的內容長度。

儘管如此,您不需要逐一讀取流,因爲您可以切換到非阻塞式讀取並請求任意數量的字符。如果沒有足夠的讀數,你會得到部分讀取的內容加上「超時」信號,你可以在你的邏輯中處理;從documentation

在錯誤的情況下,所述方法返回nil,隨後的錯誤消息 其可以是字符串的情況下,「封閉」的連接關閉 完成傳輸之前或字符串「超時'如果 在操作過程中發生超時。此外,在錯誤 消息之後,該函數返回傳輸的部分結果。

+0

謝謝!我對settimeout很困惑,看起來延遲不能低於0.3 – Eshkation