1

我利用 TcpClient 类来实现 telnet 连接。我不知道的是如何确定响应的结束。似乎一旦 DataAvailable 属性为真,我从 Stream 中读取数据,然后 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;
}
4

3 回答 3

2

对于 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"));       
于 2009-03-30T14:19:06.913 回答
0

我认为为此目的使用 DataAvailable 不是一个好主意。你的回应的结尾是你的协议所说的。

最好使用诸如 Read 之类的阻塞调用来读取您的内容,并使用您已建立的任何协议来确定阅读更多内容和阅读量。可能不是您想要的所有数据都返回,因为当您读取所有数据时,Read 不会返回,但是当读取一些数据时,您需要检查读取了多少。

如果您的协议是 Telnet,您可能希望响应接收到的每一个字节,就像您想要回显它或处理命令或其他什么的终端一样。

DataAvailable 可能适合检查调用时 Read 是否会阻塞(它将返回缓冲区中的任何内容),但它会使您的循环不那么简单。

于 2009-03-30T14:22:32.320 回答
0

这是一个实际的远程登录连接,即您是连接到远程登录服务器还是通过“远程登录”您真的是指“TCP/IP 套接字”?

首先判断服务器是否在传输完成时断开连接。如果是这样,您可以简单地阅读直到流结束。否则,如果没有,您将不得不在数据中使用提示来确定读取是否完成。在这方面,不同的协议以不同的方式工作,所以如果你能启发我们了解协议,我们可能会给出更直接的答案。方法通常分为两个阵营:包括在响应开头的字节/字符计数(接收者只需读取那么多字节/字符)或使用标记来分隔响应的结尾(接收者读取直到收到分隔符)。

于 2009-03-30T14:23:58.447 回答