Дождитесь \n вместо EOF C# SslStream

Я использую SslStream для приема клиентов. Этот код считывает 2048 байт из сокета и возвращает их в виде строки. Когда я попытался подключиться с помощью клиента, написанного на Java, сервер не ответил и застрял на этой строке:

bytes = sslStream.Read(buffer, 0, buffer.Length);

Немного погуглив, я обнаружил, что сервер ожидает завершения сообщения EOF. Это очень раздражает, так как протокол, который я построил, должен ждать \n в конце сообщения.

Есть ли способ дождаться, пока персонаж по моему выбору завершит сообщение? Я попытался добавить EOF в конец сообщения, отправленного клиентом, но безуспешно. Я отправил сообщение через PrintWriter. Я создал его с помощью этого оператора (Java):

out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())));

socket это SSLSocket. Ответы, которые я нашел в Интернете, были немного запутанными и не решили мою проблему.

Сервер:

static string ReadMessage(SslStream sslStream) 
{
    // Read the  message sent by the client.
    // The client signals the end of the message using the
    // "<EOF>" marker.
    byte[] buffer = new byte[2048];
    StringBuilder messageData = new StringBuilder();
    int bytes = -1;
    do 
    {
        // Read the client's test message.
        bytes = sslStream.Read(buffer, 0, buffer.Length);

        // Use Decoder class to convert from bytes to UTF8
        // in case a character spans two buffers.
        Decoder decoder = Encoding.UTF8.GetDecoder();
        char[] chars = new char[decoder.GetCharCount(buffer, 0, bytes)];
        decoder.GetChars(buffer, 0, bytes, chars, 0);
        messageData.Append(chars);

        // Check for EOF or an empty message.
        if (messageData.ToString().IndexOf("<EOF>") != -1)
        {
            break;
        }
    } while (bytes != 0);

    return messageData.ToString();
}

Добавление EOF в конец сообщения:

out.print(message + (char)-1);

Кроме того, я пробовал это:

out.print(message + "\r\n\r");

person IshaySela    schedule 23.12.2019    source источник
comment
Вы контролируете do {} while();, так что же удерживает вас от break после прочтения NL?   -  person dcg    schedule 24.12.2019


Ответы (1)


Немного погуглив, я выяснил, что для того, чтобы отправить окончательный сигнал, мне нужно очистить сокет, используя out.flush().

person IshaySela    schedule 14.01.2020
comment
Сокет, на который вы ссылаетесь, - это клиентский сокет java, верно? Кроме того, в приведенном выше коде вам может понадобиться обработать несколько вещей. 1. SslStream.Read может возвращать 0 байтов, в этом случае обязательно сделайте перерыв. 2. Я настоятельно рекомендую использовать асинхронную версию Read (ReadAsync), особенно при взаимодействии клиента и сервера. - person Justin Kotalik; 14.01.2020
comment
Это действительно клиентский сокет, и я проверю асинхронную функцию. Спасибо! - person IshaySela; 15.01.2020