Задать вопрос
@DustiX

TcpClient не отправляет данные. Что делать?

public void Send(string message)
        {
            if (_stream == null)
            {
                Log.Warn("Соединение не установлено.");
                return;
            }

            _sending = true;
            byte[] buffer = Encoding.UTF8.GetBytes(message);
            _stream.Write(buffer, 0, buffer.Length);
            _stream.Flush();
            _sending = false;
        }

        private void ConnectToServer()
        {
            Log.Info("Попытка подключения...");
            try
            {
                _client = new TcpClient(_host, _port);
                _stream = _client.GetStream();
                Log.Info("Соединение установлено.");
                StartListening();
            }
            catch (SocketException ex)
            {
                Log.Warn("Ошибка соединения: " + ex.Message);
                _reconnectTimer = new Timer(Reconnect, null, 2000, Timeout.Infinite);
            }
        }

        private void Reconnect(object state)
        {
            Log.Info("Переподключение...");
            _reconnectTimer.Change(Timeout.Infinite, Timeout.Infinite);
            ConnectToServer();
        }

        private void StartListening()
        {
            Thread listeningThread = new Thread(Listen);
            listeningThread.Start();
        }

        private void Listen()
        {
            byte[] buffer = new byte[1024];
            while (true)
            {
                if (!_sending)
                {
                    try
                    {
                        int bytesRead = _stream.Read(buffer, 0, buffer.Length);
                        if (bytesRead > 0)
                        {
                            string message = Encoding.UTF8.GetString(buffer, 0, bytesRead);
                            OnReceived?.Invoke(this, message);
                        }
                    }
                    catch (Exception ex)
                    {
                        Log.Warn("Ошибка при чтении потока: " + ex.Message);
                        ConnectToServer();
                        break;
                    }
                } 
                
            }
        }


Я пишу плагин для игры на Unity для логирования и исполнения команд удаленно.
Этот код - часть класса для работы плагина с ботом. При отправке запроса ботом в плагин проблем нет, команда исполняется, а при попытке отправить данные из плагина, то они не доходят. Да и еще, при перезагрузке сервера (перезагрузке, а не отключении), при отключении плагина последнее сообщение доходит до бота. Я без понятия почему такое происходит..
  • Вопрос задан
  • 80 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
BasiC2k
@BasiC2k
.NET developer (open to job offers)
У вас вроде логгирование есть, можно понять - в чём проблема.
На первый взгляд:
1. При создании Thread используйте IsBackground - для того, чтобы при закрытии программы, дочерние потоки тоже убивались, а не продолждали работать дальше в фоне

Thread listeningThread = new Thread(Listen);
listeningThread.IsBackground = true;
listeningThread.Start();


2. _client сейчас у Вас глобальная переменная, и использование многопоточности в таком случае - бессмысленно, т.к. при создании новоего соединения, старый _client перезаписывается на новый, не имеющий отношения к старому соединению;
3. Посмотрите в сторону использования SignalR. Для озвученных задач мне кажется он Вам больше подойдёт.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы