2015-10-20 40 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