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

У меня есть следующий код, исполняемый прослушивающим потоком.Что он делает: Считывает первое сообщение как общую длину сообщения, а затем собирает все пакеты в большой массив данных.(Я посылаю изображения) Все работает как задумано.
Но после получения первого изображения и выполнения функции.(«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());
    }
}

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

1 Ответ

0 голосов
/ 18 декабря 2018

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

NetworkStream stream; 

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

...