来自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
?谢谢你!
解决方案是:
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时,我偶然发现了解决方案,它是从网络读取流直到结束的解决方案。