TCP-сервер закрывает соединение после первого сообщения

У меня есть следующий код, выполняемый прослушивающим потоком. Что он делает: читает первое сообщение как общую длину сообщения, затем собирает все пакеты в большой массив данных. (Я отправляю изображения) Все работает по назначению.
Но после того, как получено первое изображение и функция выполнена. («ImageLengthResetted» распечатывается) Он закрывает соединение.
Я думаю, это связано с тем, что я выхожу за рамки:

using(connectedTcpClient = tcpListener.AcceptTcpClient())

и вот что убивает связь. Как я могу сохранить это соединение открытым?
Добавление еще одного

while(true)

после того, как меня подключили, ничего не получится. А также выполнение цикла while, завершенного после использования статов.

private void ListenForIncommingRequests()
{
    try
    {
        // Create listener on localhost port 8052.  
        localAddr = IPAddress.Parse(IPadrr);
        Debug.Log(localAddr);
        tcpListener = new TcpListener(localAddr, port);
        Debug.Log("Before Init tcplistern");
        tcpListener.Start();
        Debug.Log("Server is listening");
        Byte[] dataRecieved = new Byte[SEND_RECIEVE_COUNT];
        while (true)
        {
            using (connectedTcpClient = tcpListener.AcceptTcpClient())
            {
                Debug.Log("Accepted TCP Client");
                // Get a stream object for reading                  
                using (NetworkStream stream = connectedTcpClient.GetStream())
                {
                    int length;
                    Debug.Log("Accepted Stream");
                    // Read incomming stream into byte arrary.                      
                    while ((length = stream.Read(dataRecieved, 0, dataRecieved.Length)) != 0)
                    {
                        Debug.Log("receiving Loop lengt: " + length);
                        counterReceived++;
                        //Get Message length with first message
                        if (messageLength == 0)
                        {
                            messageLength = System.BitConverter.ToInt32(dataRecieved, 0);
                            data = new byte[messageLength];
                            messageJunks = messageLength / SEND_RECIEVE_COUNT;
                            restMessage = messageLength % SEND_RECIEVE_COUNT;
                            junkCounter = 0;
                        }
                        else
                        {
                            if (junkCounter < messageJunks)
                            {
                                Array.Copy(dataRecieved, 0, data, junkCounter * SEND_RECIEVE_COUNT, SEND_RECIEVE_COUNT);
                                junkCounter++;
                            }
                            else
                            {
                                Array.Copy(dataRecieved, 0, data, junkCounter * SEND_RECIEVE_COUNT, restMessage);
                                //Whole Message recieved, reset Message length
                                messageLength = 0;
                                readyToDisplay = true;
                                Debug.Log("ImageLengthResetteed");
                            }
                        }
                    }
                }
            }
        }
    }
    catch (Exception socketException)
    {
        Debug.Log("SocketException " + socketException.ToString());
    }
}

На стороне клиента открывается поток отправки со следующей функцией, в которой socketConnection глобально инициализируется в принимающем потоке клиента:

private void sendData(byte[] data)
{
    try
    {
        //socketConnection = new TcpClient(IPadrr, port);
        using (NetworkStream stream = socketConnection.GetStream())
        {
            //Prepare the Length Array and send first
            byte[] dataLength = BitConverter.GetBytes(data.Length);
            int packagesSend = 0;
            int numberPackages = data.Length / SEND_RECIEVE_COUNT;
            if (stream.CanWrite)
            {
                for (counter = 0; counter <= data.Length; counter += SEND_RECIEVE_COUNT)
                {
                    if (counter == 0)
                    {
                        stream.Write(dataLength, 0, dataLength.Length);
                    }

                    if (packagesSend < numberPackages)
                    {
                        stream.Write(data, counter, SEND_RECIEVE_COUNT);
                        Thread.Sleep(20);
                        packagesSend++;
                    }
                    else
                    {
                        stream.Write(data, counter, data.Length % SEND_RECIEVE_COUNT);
                        Debug.Log("FINDISCHD");
                    }
                }
            }
        }
    }
    catch (Exception err)
    {
        print(err.ToString());
    }
}

Рад любой помощи!

Как выглядит ваш клиентский код?

MindSwipe 18.12.2018 14:08

добавил клиентский код. Но это не проблема сервера. Исключение сокета говорит, что удаленный хост закрыл соединение.

Ti Mo 18.12.2018 14:32

Remotehost - это просто клиент, который не является вашим местным. Итак, если код сервера бросает его, удаленный хост является клиентом и наоборот.

MindSwipe 18.12.2018 14:36

У вас проблема с тестированием цикла While для конца потока. Чтение TCP-потока отличается от файлового потока. Файловый поток, когда вы доходите до конца файла, вы читаете нуль, а затем прекращаете чтение и закрываете файл. С TCP вы находитесь в конце файла, чтобы начать его еще до того, как вы получите какие-либо данные. Произойдет проверка на ноль, а затем вы выйдете из цикла while и закроете соединение.

jdweng 18.12.2018 14:38

Можете ли вы немного очистить свой код и удалить ненужные части? Очень сложно понять, что происходит в таком состоянии.

MindSwipe 18.12.2018 14:40

ай ладно, запуталась словом "хозяин". Итак, я, вероятно, исчерпал область использования (Networkstream) после отправки, а затем соединение закрывается?

Ti Mo 18.12.2018 14:42

Я считаю, что нашел проблему. Это на клиенте. Вы глобально инициализируете socketConnection, но затем удаляете поток после using(NetworkStream stream = socketConnection.GetStream()

MindSwipe 18.12.2018 14:42

итак, глобально инициировать поток, чтобы он оставался открытым?

Ti Mo 18.12.2018 14:47

@jdweng, но соединение не установлено в цикле while, где я проверяю длину

Ti Mo 18.12.2018 14:49

Я бы запускал TcpClient каждый раз, когда вам нужно было вызвать веб-службу. За исключением случаев, когда вы знаете, что собираетесь вызывать веб-службу несколько раз подряд.

MindSwipe 18.12.2018 14:50

Спасибо @MindSwipe, я решил это! Глобальная инициализация потока делает свое дело

Ti Mo 18.12.2018 15:04
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
11
240
1

Ответы 1

Проблема была на стороне клиента. Я инициализировал

NetworkStream stream; 

теперь глобально в той же функции socketConnection получает init.

Другие вопросы по теме