2014-10-20 53 views
2

我有一臺Kinect傳感器連接到PC,我的應用程序通過另一臺PC上的TCP連接請求幀。我的問題是,我無法觸發兩個請求並將幀重新連接。C#客戶端無法觸發服務器連接

這是在其被連接到所述傳感器上的服務器側的代碼:

while(running) 
{ 
    if (networkStreamReceive.DataAvailable) 
    { 
     byte[] clientRequest = new byte[8]; 
     networkStreamReceive.Read(clientRequest, 0, clientRequest.Length);    
     string clientData = System.Text.Encoding.ASCII.GetString(clientRequest); 
     clientData = clientData.Substring(0, clientData.IndexOf("$")); 
     if (clientData == "1") 
     { 
      // Process sensor data. 
      // Takes about 5-15 ms. 
     }       
    } 
} 

在客戶端,它使一個請求如下:

NetworkStream serverStreamSend = clientSocketSend.GetStream();  

//Send the request. 
byte[] outStream = System.Text.Encoding.ASCII.GetBytes("1$"); 
serverStreamSend.Write(outStream, 0, outStream.Length); 
Thread.Sleep(800); // Works for 1000ms and above. 
serverStreamSend.Write(outStream, 0, outStream.Length); 

receivedFrame = receiveFrame(); 
receivedFrame = receiveFrame(); 

其中接收幀讀取數據從流。

這隻適用於在客戶端添加至少一秒的睡眠。如果我刪除了這個睡眠,我發現客戶端可以同時觸發這兩個請求,但是卡在閱讀第二個receiveFrame。

在服務器端,我看到第一個觸發器進來了,但第二個觸發器沒有通過。當處理傳感器數據的時間僅爲10-15ms時,我無法理解爲什麼會這樣。

+0

你有沒有考慮這樣做,而不是這條線在這裏了''ReadAllBytes' networkStreamReceive.Read(' – MethodMan 2014-10-20 19:31:12

+0

networkStreamReceive是一個類型的NetworkStream的對象,我沒有看到一個ReadAllBytes功能。 – trycatch22 2014-10-20 19:35:57

回答

0

第二個確實通過了,但是您的代碼沒有注意到,因爲您沒有檢查Read()方法的返回值以查看實際可用的數據量。

當客戶端足夠快地發送請求時,它們會合併爲單個傳輸,並且這兩個請求都可以在Read()的單個調用中使用。但是你的代碼只會檢查那個傳輸中的第一個請求,並會丟棄第二個請求。

假設$字符是作爲協議的分隔符,則應該改變你的服務器側,使得服務器繼續從接收緩衝器讀出的數據一路到底,把每個$ -delimited部分作爲單個請求。

如果$字符不是分隔符,那麼您將需要決定將用於分隔符的內容幷包含您的協議。

+0

謝謝!這是問題。我改變客戶端到: byte [] clientRequest = new byte [2] 而且工作! – trycatch22 2014-10-20 19:59:12

+0

如果您確定郵件總是隻有兩個字符長,這是一種方法,但請記住,雖然在實踐中難以置信的是,但理論上可能的是,你的雙字符消息會被分成兩個不同的單字節接收。爲了100%確定對任何奇怪的,難以解釋的錯誤,如果你只是正確地寫了接收代碼:檢查返回代碼並正確處理接收任何數量的數據,無論是更多,更少,還是完全相同。 – 2014-10-20 21:56:39