Итак, я создаю программу, которая может читать вывод из командной строки Windows.Это работает, как показано здесь:
Process process = new Process();
process.StartInfo.FileName = "cmd.exe";
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.CreateNoWindow = true;
process.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived);
process.ErrorDataReceived += new DataReceivedEventHandler(p_ErrorDataReceived);
В обработчике событий я подключаю сеть к выходу.(сервер также написан на C # с использованием потоков)
static void p_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
if (!String.IsNullOrEmpty(e.Data))
{
socketInput.WriteLine(e.Data);
socketInput.Flush();
}
}
Это работает почти полностью нормально, за исключением того, что некоторые специальные символы (например, шведские символы) печатаются как бессмысленные слова на стороне сервера.Я пробовал только Console.WriteLine(e.Data)
на стороне клиента, и это, кажется, работает, поэтому я думаю, что это связано с моим кодированием в сетевой части.Может ли кто-нибудь объяснить мне проблему здесь?Я попытался выяснить, какую кодировку использовать, но мне не повезло.
Кстати.Вот потоки сокетов (они похожи на стороне сервера)
socketInput = new StreamWriter(client.GetStream());
socketOutput = new StreamReader(client.GetStream());
Socket Init на стороне клиента:
TcpClient client = new TcpClient();
//retry connection until found
while (true)
{
try
{
client.Connect("127.0.0.1", 4444);
}
catch (Exception ex)
{
//handle errors
continue;
}
if (client.Connected) break;
System.Threading.Thread.Sleep(1);
}
Socket Init на стороне сервера:
TcpListener listener = new TcpListener(IPAddress.Any, 4444);
listener.Start();
Console.WriteLine("Waiting for a connection...");
TcpClient client = listener.AcceptTcpClient();
Получение кода (запускается в отдельном потоке):
while(true)
{
try
{
Console.WriteLine(socketOutput.ReadLine());
} catch(Exception e)
{
Console.WriteLine("Connection lost!");
return;
}
}