2011-07-15 61 views
1

發送內部串換行符試圖發送包含利用tcpclient和C#,其中的換行字符需要保持完整詞語之間的數的換行字符構成的字符串...通過TcpClient的

運行的C++例子是在這裏:

TCPClient->IOHandler->DefStringEncoding = enUTF8; 
TCPClient->IOHandler->WriteLn("write text"); 
TCPClient->IOHandler->WriteLn("Test\n\n\nTest"); 

有了這個代碼字符串中的服務器顯示了文本框的方式我想:測試\ n \ n \ NTEST

但是,試圖C#時:

clientStreamWriter.WriteLine("write text"); 
clientStreamWriter.WriteLine("Test\n\n\nTest"); 

此字符串顯示了服務器中的文本框爲:測試 然後服務器會返回一個未知的命令響應......好像作爲的StreamWriter打破在換行符的字符串,並將剩餘部分作爲一個新的字符串和服務器期望一個新的命令。

我該如何防止這種情況發生?我不知道服務器代碼是什麼,用C++編寫的程序對我來說不是一種選擇:)

回答

1

問題在於你的服務器協議;你需要改變服務器來修復它。 You need message framing.

+0

服務器是第三方,不幸的是我無法訪問源代碼。但是因爲它可以與上面的C++例子以及通過telnet一起工作,所以我也應該能夠使它與c#一起工作? – Daniel

+0

服務器**損壞**;你應該依靠供應商來解決它。它只是*發生*有時工作。也就是說,SLak發佈了一個可能工作的答案 - 將'AutoFlush'設置爲'false',然後在每個'WriteLine'調用之後調用'Flush'。請注意,你*不*解決問題;你只是希望避免它。服務器仍然是錯誤的,一旦其他因素髮揮作用(其他進程交換進/出內存,客戶端/服務器之間的路由器改變等),**將**仍然失敗。 –

0

或者你可以分割你的串起來,將其作爲單獨的電話......

假設你的客戶是足夠聰明弄清楚/你的協議定義以某種方式結束訊息話題?

TCPClient->IOHandler->DefStringEncoding = enUTF8; 
TCPClient->IOHandler->WriteLn("write text"); 
TCPClient->IOHandler->WriteLn("[[begin]]"); 
TCPClient->IOHandler->WriteLn("Test"); 
TCPClient->IOHandler->WriteLn(""); 
TCPClient->IOHandler->WriteLn(""); 
TCPClient->IOHandler->WriteLn(""); 
TCPClient->IOHandler->WriteLn("Test"); 
TCPClient->IOHandler->WriteLn("[[end]]");