Я использую 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");
do {} while();
, так что же удерживает вас отbreak
после прочтенияNL
? - person dcg   schedule 24.12.2019