Ответ Socket Client - PullRequest
       4

Ответ Socket Client

0 голосов
/ 18 октября 2011

Я создаю приложение сокет клиент / сервер. И я не могу решить эту проблему, возможно, из-за недостатка знаний по этому вопросу.

Клиент должен отправить ответ, чтобы продолжить общение:

while(comunicate)
{
    if (chkCorrectAnswer.Checked)
                answer = encoder.GetBytes('\x02' + "82SP|" + '\x03');
            else
                answer = encoder.GetBytes("bla");
            ServerStream.Write(answer, 0, answer.Length);

            //or ??
            //tcp.Client.Send(answer);
}

И сервер его получает:

while(comunicate)
{
    var validanswer= encoder.GetBytes("myvalidanswer");

    answer = new byte[validanswer.Length];
    stream.Read(answer, 0, validanswer.Length);

    //or ??
    //tcp.Client.Receive(answer);

    if (answer.SequenceEqual(validanswer))
        // continue communication
}

Каждый код находится в отдельном приложении, зацикливая "поток сообщений".

Кажется, что ответ отправлен правильно, но сервер, похоже, не получает его с ошибкой. Иногда он получает blablab или lablabl и вариации с 7 символами. Я полагаю, что прием заполнил бы буфер только входящими данными и каким-то образом заполнил буфер повторными данными.

Два вопроса здесь:

  1. Что я должен использовать, stream.write / read или client.send / recieve?
  2. Как обеспечить проверку этого ответа?

Ответы [ 3 ]

1 голос
/ 19 октября 2011

Когда вы прочитаете, вы получите все, что вы написали, включая то, что вы написали ранее.

Реализуйте заголовок длины или какой-нибудь разделитель, чтобы вы знали, что к чему -

длина + сообщение

или

сообщение + разделитель

Затем разберите его, когда будете читать.

1 голос
/ 19 октября 2011

0x02 и 0x03 называется началом текста (STX) и концом текста (ETX) и являются разделителями, используемыми для определения того, где ваши сообщения начинаются и заканчиваются. На самом деле нет необходимости использовать оба, это была обычная практика при последовательной связи.

Вам необходимо продолжить создание сообщения до получения ETX.

что-то вроде (простое решение, но не очень эффективное, если у вас много клиентов)

string buffer = "";
var readBuffer = new byte[1];
int readBytes = 0;
while ((readBytes = stream.Read(readBuffer, 0, 1))  == 1 && readBuffer[0] != 3)
{
   buffer += readBuffer[0];
}

Вы, конечно, можете читать большие куски. Но тогда вам нужно проверить, поступило ли более одного сообщения, и обработать буфер соответствующим образом. Вот как бы я это сделал.

1 голос
/ 18 октября 2011

Я полагаю, что прием заполнил бы буфер только входящими данными и каким-то образом заполнил буфер повторными данными.

Ну, вы многократно отправляете данные в цикле, так что этого следовало ожидать.

Если вы хотите прочитать только определенное количество байтов из потока, вам также необходимо отправить размер логического пакета перед ним, чтобы принимающая сторона могла сначала прочитать размер (скажем, как фиксированное значение типа int) и тогда фактический ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...