2013-09-26 90 views
2

我通過TCP套接字發送和接收JSON數據。當數據量較小時,它可以正常工作,如200字節左右。但是當它達到大約10 KB時,它只接收部分數據。我試過所有不同的TCP套接字檢索數據命令,我可以找到(讀取,獲取,gets.chomp,recv),但我無法找到一個適用於我所有測試的工具。通過ruby TCP接收大量數據的問題Socket

這裏是我現在的代碼:

socket = TCPSocket.new '10.11.50.xx', 13338 
response = socket.recv(1000000000) 

我也嘗試添加了超時,但我無法得到它的工作:

socket.setsockopt(Socket::SOL_SOCKET, Socket::SO_RCVTIMEO, 1) 

我不知道我錯過了什麼。任何幫助,將不勝感激。

回答

2

這是badly documented在Ruby文檔中,但我認爲TCPSocket#recv實際上只是調用recv系統調用。那一個(請參閱man 2 recv)從內核確定的流中讀取大量字節,但不超過應用程序指定的字節數。要接收更大的「消息」,您需要在循環中調用它。

但有一個更簡單的方法:因爲TCPSocket間接地從IO類繼承,你all of its methods免費,包括IO#read你(如果可能)指定並讀取的字節數。

您還西港島線需要實現的方式來界定您的消息:

  • 使用固定長度的消息
  • 發送消息的長度前面的(固定大小)頭
  • 使用某種終結者,例如NULL字節
+1

這解決了我的問題。我使用TLV封裝器發送了響應,並能夠使用該長度來確定要讀取的字節數。我用'TCPSocket#read'代替'TCPSocket#recv'。謝謝! – rmsimpsonau