2015-10-20 41 views
0

這麼長的故事,我試圖開發一個應用程序,需要與服務器的Tcp連接。在這個領域沒有以前的經驗,我結束了沒有我的功能工作。所以我決定做一個簡單的控制檯應用程序只是爲了檢查我的命令和他們的反應。關於建立連接的部分進行得很順利,關於寫入網絡流的部分也是如此(我認爲),但是當我試圖顯示服務器響應時,我碰到了一堵牆: 每次我的porgram到達必須編寫服務器響應的行時和WriteLine,我的控制檯應用程序全黑,全部文本消失。你能告訴我使用的代碼有什麼問題嗎?直到控制檯顯示響應的部分進展順利,我檢查了一切。我想有服務器的階躍響應爲普通字符串(如果可能的話我猜...)問題與TcpClient服務器響應作爲字符串

static void ServerTalk(TcpClient tcpClient,NetworkStream networkStream, StreamWriter streamWriter, StreamReader streamReader) 
    { 
     //Messaging methods: 
     Console.WriteLine("Client: "); 
     string message = Console.ReadLine(); 
     streamWriter.WriteLine(message); 
     streamWriter.Flush(); 
     //Response methode: 
     byte[] data = new byte[tcpClient.ReceiveBufferSize]; 
     int ret = networkStream.Read(data, 0, data.Length); 
     string respond = Encoding.ASCII.GetString(data).TrimEnd(); 
     Console.WriteLine("Server: "); 
     Console.WriteLine(respond); 
     ServerTalk(tcpClient, networkStream, streamWriter, streamReader); 
    } 
+0

我懷疑您發送的數據顯示爲黑色的數據末尾處有空值。我將在發件人處終止數據並返回('\ n'),然後在接收端只打印字符直到返回。 – jdweng

+0

該方法結束時的遞歸調用呢?這應該如何工作? –

+0

@HughJones @HughJones我只是把它放在一起,以便重新開始整個事情,因爲應用程序要做的所有事情都是在該代碼塊中,其餘代碼都工作並且一次使用,不要以爲我需要這個應用程序來做超出這一點的任何事情。 – soorena12

回答

0

你需要處理僅RET字節,您所翻譯的陣列中的所有字節。

複製到'ret'長的新陣列然後解碼。

var retarr = new byte[ret]; 
Array.Copy(data,retarr,ret); 
string respond = Encoding.ASCII.GetString(retarr); 

更重要的是要注意,這種tcp通信的方法是行不通的。您假定當您在一個塊中發送x個字節時,您將在一個塊中接收x個字節,但事實並非如此,您可以發送1 100個字節的消息並接收100個1個字節的消息

這意味着您的任務很多更復雜。你需要設計一種發送自我描述數據的方式 - 以便你知道它完全被接收。通常你會發送一個長度,然後是數據。然後,您繼續循環接收代碼,直到您收到許多字節

+0

非常感謝你的更新,你的權利我所做的是複雜的,但我們都必須從某個地方開始。 – soorena12

+0

如果您再次遇到問題,請發佈另一個問題。學習使用vs調試器 – pm100