C # потоковое кодирование символов и вывод из консоли - PullRequest
0 голосов
/ 11 декабря 2018

Итак, я создаю программу, которая может читать вывод из командной строки 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;
            }

        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...