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