2013-11-20 40 views
1

我正在使用TcpClient並將我的應用程序連接到服務器。此服務器使用二進制數據序列化,所以我要送以二進制格式要求,但得到的響應這樣的:從服務器讀取二進制響應

enter image description here 有我的代碼:

TcpClient client = new TcpClient("173.240.5.1", 443); 
     NetworkStream stream = client.GetStream(); 

     System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding(); 

     byte[] sendBytes = encoding.GetBytes("YmFzZTY0IGVuY29kZWQgc3RyaW5n"); 

     stream.Write(sendBytes, 0, sendBytes.Length); 

     byte[] bytes = new byte[client.ReceiveBufferSize]; 
     int response_int = stream.Read(bytes, 0, client.ReceiveBufferSize); 


     Console.WriteLine(response_int); 

請幫忙解決問題,對不起我的英語!

+0

你在什麼時候把數據放入'bytes'中? –

+0

問題在哪裏? – Reda

+0

「此服務器使用二進制數據序列化」 - 您能更具體地瞭解您所遵循的規則嗎?目前看起來您正在發送ASCII ...另外:*接收*代碼在哪裏? –

回答

0

答案似乎寫在Mime64中。整個緩衝區只包含0.似乎你沒有迴應。您可否在stream.read之前等待(Thread.Sleep(500))。支付attantion是ReceiveBufferSize這是緩衝區的大小,但沒有收到字節

+0

'睡眠'是等待套接字數據的一種*糟糕的方式; p –

+0

響應再次爲0.可以是請求中的問題嗎?文檔中有對請求的描述: '在發送未加密的消息(在本例中需要生成授權密鑰)之前,客戶端必須按照以下方式進行(p,q)授權: 1)客戶端向服務器發送查詢 req_pq#60469778現時:int128 = ResPQ' –

+0

Marc,有什麼機會等待迴應? :) –

2
byte[] bytes = new byte[client.ReceiveBufferSize]; 
int response_int = stream.Read(bytes, 0, client.ReceiveBufferSize); 

和(評論)「我越來越0響應」的量。

stream.Read的返回值是讀取的字節數;要點:

  • 它不能保證你會填充緩衝區
  • 如果它返回一個非正數,沒有什麼更多的閱讀,會有永遠是任何更多閱讀:在數據流已關閉,處於結尾,EOF等
  • 未關閉時,只能保證(不計算例外)讀取至少一個字節(且不超過指定的緩衝區數量) - 並且將直到它可以做到這一點(或通過例外超時)
  • whe ñ收到一個正數,並不能保證你有一個完整的數據包/消息/幀等;你可以肯定地說,它是「一些數據,這麼多字節」;它也不能告訴你更多的數據是否到達不久,或確實比較數據是否已經緩存在NIC

因此,如果它返回0,沒有數據。沒有收到插座已關閉。無論等候多久都無所謂:它永遠不會到達。如果不知道如何設置這些套接字或服務器在做什麼,我就不能多說了。但是,只能在一個方向關閉套接字(兩端都可以)。這聽起來像你連接的服務器已經關閉了它的發送套接字(你的接收套接字)而不發送任何數據。

相關問題