好吧所以我做了一个远程命令操作符。它由服务器和客户端两部分组成,客户端发送命令,服务器执行它并返回输出。
现在对于某些人来说,我无法读取所有输出,我只能阅读几行,然后等待超时。
我发送命令的输出就像这样 " [CommandName的:PID]:OneLineOfOutput \ n" 然后对于命令输出的每一行重复
然后我尝试逐行读取此行,当没有东西要读取时,我会超时读取过程并等待新命令发送到服务器。
它输出的东西看起来像这样
[ListCmds:1232]:ListCmds:0
[ListCmds:1232]:Shutdown:1
[ListCmds:1232]:FullSysShutdown:2
[ListCmds:1232]:Restart:3
这就是我在控制台上看到的
[ListCmds:1232]:ListCmds:0
[ListCmds:1232]:Shutdown:1
它似乎只是跳过2行。
我的阅读线程代码
private static void ReturnManager(Socket Soc)
{
//Thread.Sleep(100);
using (StreamReader RS = new StreamReader(new NetworkStream(Soc)))
{
DateTime TMR = DateTime.Now;
while (true)
{
if (RS.Peek() > 0)
{
Console.WriteLine(RS.ReadLine());
TMR = DateTime.Now;
}
if (!Soc.Connected)
{
break;
}
if (DateTime.Now - TMR > TimeSpan.FromSeconds(LastReadTimeoutSeconds))
{
break;
}
Thread.Sleep(20);
}
}
Soc.Close();
Soc.Dispose();
}
现在在你问我之前我确实确保所有的数据都是通过serer端的套接字发送的,而不是客户完全阅读它。
答案 0 :(得分:0)
private static void ReturnManager(Socket Soc)
{
//Thread.Sleep(100);
using (StreamReader RS = new StreamReader(new NetworkStream(Soc)))
{
DateTime TMR = DateTime.Now;
while (true)
{
while (RS.Peek() > 0 | Soc.Available > 0)
{
Console.WriteLine(RS.ReadLine());
TMR = DateTime.Now;
}
if(DateTime.Now - TMR > TimeSpan.FromSeconds(LastReadTimeoutSeconds))
{
try
{
if (!Soc.Connected) break;
else
{
Soc.Send(new byte[1] { 255 });//Verify that the Server is still keeping the Socket open thus the command is still active
TMR = DateTime.Now;
}
}
catch
{
break;
}
}
}
}
Soc.Close();
Soc.Dispose();
}
我让它像这样工作它现在将读取所有数据,直到套接字关闭或停止接受输入数据包。