我利用TcpClient的类来实现的Telnet连接。我不知道是如何确定响应的结束。看来,一旦DataAvailable属性为true,我读了流和DataAvailable数据然后暂时设置为false,同时缓存被装满数据的另一块,但我认为这是所有阅读并消失。如何确保所有响应读?

您可以告诉我如何更改下面的代码片段,以正确地完成这项工作。当我单步执行代码,因为没有足够的时间来检索整个响应它工作正常。感谢您的帮助。

if (this.Stream.DataAvailable)
{
    readBuffer = new Byte[this.Client.ReceiveBufferSize];
    do
    {
        // read data
        bytes = this.Stream.Read(readBuffer, 0, readBuffer.Length);
        Thread.Sleep(10);
        responseData = String.Concat(responseData, System.Text.Encoding.ASCII.GetString(readBuffer, 0, bytes));

       } while (this.Stream.DataAvailable);

       allDataRead = true;
       break;
}
有帮助吗?

解决方案

使用类似telnet应用的TCP连接没有这样的概念作为传输的结束。你经常会发现,发送每次打开一个按键一个在用户输入他们,它是由服务器来决定何时采取行动,通常是当它得到一个换行符Telnet客户端。其他客户端可以缓冲了几个客户端按键和一次发送它们。

通过您的应用程序的外观,你应该找换行来表示传输的结束。

do    
{      
     bytes = this.Stream.Read(readBuffer, 0, readBuffer.Length);             
     responseData = String.Concat(responseData, System.Text.Encoding.ASCII.GetString (readBuffer, 0, bytes));       
} while (this.Stream.DataAvailable && !responseData.Contains("\n"));       

其他提示

我不认为这是使用DataAvailable用于此目的的好主意。您的响应的结束是不管你的协议说,这是

这是更好地使用像读阻塞调用来读你的东西,并使用任何协议你建立确定要读更多,和多少。这可能是不是你想要的所有数据返回,因为当所有的数据被读取读不返回,而是在读一些数据,所以你需要检查被读了多少。

如果您的协议是远程登录,您可能会希望为一个终端要呼应它或过程的命令或者什么不回应每一个接收的字节。

DataAvailable也许是适合于检查是否读会阻塞调用时(它会与无论是在缓冲返回),但它使你的循环那么简单。

这是一个实际的telnet连接,即你连接到Telnet服务器或“远程登录”你真的是“TCP / IP套接字”?

首先确定传输完成时,服务器是否断开连接。如果是这样,你可以简单地读,直到流的末尾。否则,如果没有,你将不得不使用的提示数据,以确定是否读取完成。不同的协议以不同的方式工作,在这方面,所以如果你能够告诉我们,我们也许能够给出更直接的答案的协议。方法一般分为两个阵营:包括字节计数/在反应的开始字符(接收机简单地读出很多字节/字符)或其他使用的标记来分隔响应的结束(接收读取直到接收到分隔符)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top