来自TCP客户端的ReadToEnd

本文关键字:ReadToEnd 客户端 TCP 来自 | 更新日期: 2023-09-27 17:49:27

我正在使用c#中的实用程序,它可以帮助我通过telnet连接远程unix服务器(http://www.codeproject.com/KB/IP/MinimalisticTelnet/MinimalisticTelnet.zip)。这个实用程序使用一个名为Write的函数在shell中写入。

TcpClient tcpSocket;
public void Write(string cmd)
{
    if (!tcpSocket.Connected) 
        return;
    byte[] buf = System.Text.ASCIIEncoding.ASCII.GetBytes(cmd.Replace("'0xFF","'0xFF'0xFF"));
    tcpSocket.GetStream().Write(buf, 0, buf.Length);
} 

调用另一个函数来读取输出:

public string Read()
{
    if (!tcpSocket.Connected) 
        return null;
    StringBuilder sb=new StringBuilder();
    do
    {
        ParseTelnet(sb);
        System.Threading.Thread.Sleep(TimeOutMs);
    } while (tcpSocket.Available > 0);
    return sb.ToString();
}

此函数确实返回命令的输出,但由于命令可能持续很长时间,因此它不能返回我需要的所有输出,因为它在执行完成之前退出。我不能做Thread.Sleep(time),因为不是所有命令的执行时间都是恒定的。有没有办法强制代码到read the data till the end with TcpClient ?谢谢你!

来自TCP客户端的ReadToEnd

解决方案是:

public string WriteCommandOverTcp(string cmd)
{
    string response = "";
    using (NetworkStream stream = tcpSocket.GetStream())
    {
        using (StreamWriter writer = new StreamWriter(stream))
        {
            writer.AutoFlush = true;
            using (StreamReader reader = new StreamReader(stream))
            {
                writer.WriteLine(cmd);
                // If I comment the line below, the server receives the  first message
                // otherwise it keeps waiting for data
                response = reader.ReadLine();
            }
        }
    }
    return response;
}

当我听说NetworkStream API时,我偶然发现了解决方案,它是从网络读取流直到结束的解决方案。