来自TCP客户端的ReadToEnd

时间:2014-03-11 14:35:22

标签: c# .net tcpclient

我在c#中使用实用程序帮助我通过远程unix服务器上的telnet连接(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?谢谢!

1 个答案:

答案 0 :(得分:0)

解决方案是:

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时,我偶然发现了解决方案,它是从网络读取流的解决方案。