Чтение данных с NetworkStream C#

126
05 декабря 2020, 04:50

Пишу редактор кода на Windows Forms с возможностью следить за процессом написания с других компьютеров. Когда клиент(писатель) пишет, каждое изменение отправляется на сервер, а с сервера остальным клиентам(рецензентам). Клиент рецензента может отправлять некоторые запрос на сервер, а сервер отсылает ответ. В то же время, сервер постоянно шлёт данные об изменениях рецензентам. Он запускается в отдельной нити как только мы начинаем наблюдение за писателем. Пока я не начинаю наблюдение, я могу отправить любой другой запрос на сервер. Как только начинается наблюдение - начинаются ошибки. В чём проблема - всё это делается через один NetworkStream. Но я не знаю как сделать по-другому, чтобы изменения улавливались как только так сразу и одновременно чтобы можно было отсылать другие запросы на сервер. Может сделать ещё один поток NetworkStream? Подскажите как грамотно разрешить проблему. Вот код всей формы:

Вот функция захвата изменений, которая работает в отдельной нити после начала наблюдения:

public void CatchChanges()
        {
            while (true)
            {
                try
                {
                    byte[] bytes = new byte[64]; // буфер для получаемых данных
                    StringBuilder builder = new StringBuilder();
                    int count = 0;
                    do
                    {
                        count = stream.Read(bytes, 0, bytes.Length);
                        builder.Append(Encoding.UTF8.GetString(bytes, 0, count));
                    }
                    while (stream.DataAvailable);
                    Program.mainReviewerForm.WriteTextSafe(builder.ToString());
                }
                catch (Exception e)
                {
                }
            }
        }

Функции которые вызываются при обычных запросах к серверу:

private int Send(string data) {
            byte[] bytes = Encoding.UTF8.GetBytes(data);
            int count = data.Length;
            stream.Write(bytes, 0, data.Length);
            return 0;
        }
public string AcceptResponse()
        {
            try
            {
                byte[] bytes = new byte[64]; // буфер для получаемых данных
                StringBuilder builder = new StringBuilder();
                int count = 0;
                do
                {
                    count = stream.Read(bytes, 0, bytes.Length);
                    builder.Append(Encoding.UTF8.GetString(bytes, 0, count));
                }
                while (stream.DataAvailable);
                string response = builder.ToString();
                return response;
            }
            catch (Exception e) {
                return e.Message;
            }
        }

Вот функция загрузки формы. В конце запускается нить на приём изменений.

private void ReviewerForm_Load(object sender, EventArgs e)
        {
            string response = reviewer.Connect();
            if (reviewer.IsConnected() == true)
            {
                string chosenWriter = ChoseWriter();
                string writerData = reviewer.StartWatching(chosenWriter);
                if (writerData != OperationResult.noConnectedWriters)
                {
                    if (writerData == OperationResult.success)
                    {
                        richTextBox1.Text = "";
                    }
                    else
                    {
                        richTextBox1.Text = writerData;
                    }
                }
                else
                {
                    MessageBox.Show(OperationResult.noConnectedWriters, "Ошибка");
                    return;
                }
            }
            else
            {
                MessageBox.Show(OperationResult.couldNotConnect, "Ошибка");
                return;
            }
            ReviewerRequest rr = new ReviewerRequest();
            rr.stream = reviewer.GetStream();
            accept = new Thread(rr.CatchChanges);
            accept.Start();
        }
READ ALSO
Ошибка подключения базы Битрик (bitrix)

Ошибка подключения базы Битрик (bitrix)

Разворачиваю бекап сайта на локалке (опен сервер), в фале settingsphp и dbconn

115
Как заменить текст между точками?

Как заменить текст между точками?

Делаю вывод даты с текстовым месяцемОт даты отнимается несколько дней

117
Как утановить ограничение времени на fsockopen

Как утановить ограничение времени на fsockopen

Проблема такая: скрипт стучится к неправильному IP слишком долго (>30s)

126
SMS шлюз для верификации номера телефона

SMS шлюз для верификации номера телефона

Есть форма отправки с полями имени фамилией email и телефонаНужно реализовать проверку номера телефона с помощью смс кода

119