我寫這與服務器通信的TCP客戶端。在專門的「聆聽」線程中,我擁有如下代碼。只有在那裏有數據時才應該讀取數據。 ()偶爾讀讀C#TCP客戶端接收不到數據 - 「無」
奇怪的是,偶爾我,程序將會崩潰,因爲流將讀取絕對沒有數據。它將返回一個空的string
。更奇怪的是,如果我嘗試在'handleResponse(string s)
'函數中'捕捉'一個空字符串,它不會被捕獲。
public void listenForResponses()
{
Console.WriteLine ("Listening...");
while (isConnected == true)
{
Thread.Sleep (updateRate);
String responseData = String.Empty;
if (stream.DataAvailable) {
Int32 bytes = stream.Read (data, 0, data.Length);
Console.WriteLine (" >> Data size = "+data.Length);
responseData = System.Text.Encoding.ASCII.GetString (data, 0, bytes);
output = responseData+"";
handleResponse (output);
}
if (isConnected == false) {
closeConnection();
}
}
}
public void handleResponse(string msg)
{
Console.WriteLine ("Received: "+msg);
iterateThroughEachCharInString (msg);
if ((msg != "")&&(msg != null)&&(msg != " ")) {
JSONDataObject desrlzdResp = JsonConvert.DeserializeObject<JSONDataObject>(msg);
if ((desrlzdResp.instruction != null)) {
if (desrlzdResp.instruction == "TestConn") {
handleTestConn (desrlzdResp);
} else if (desrlzdResp.instruction == "SceneOver") {
handleSceneFinished (desrlzdResp);
}
}
}
}
引發的異常是System.NullReferenceException
在handleResponse
功能
你假設一個發送()對應於一個接收(),但是這並不插槽如何工作。 'responseData'可以包含一個消息,多個或部分消息。您需要一個成幀協議來區分這些情況,例如,通過在數據前加上一個數字來指示後續有多少字節。嘗試seaching。 – CodeCaster
好吧,看起來'desrlzdResp'爲空,因此在'JSONDataObject desrlzdResp = JsonDataverthe.DeserializeObject(msg)之後添加'if(desrlzdResp!= null)'''應該避免null參考異常 –
Pikoh
@Pikoh不,那麼你會失去數據。 'handleResponse()'可以接收部分或多個消息,導致'JsonConvert.DeserializeObject()'失敗。 OP需要確保他們只用完整的消息調用'handleResponse()'。 – CodeCaster