Отправьте значение по сокету и прочитайте значение с помощью reader.ReadInt32() изменяет значение

Я пытаюсь отправить значение по сокету. Итак, у меня есть две части в моем проекте Client и server.

client отправляет значение на сервер, используя этот код:

           System.IO.BinaryWriter binaryWriter =
           new System.IO.BinaryWriter(networkStream);
           binaryWriter.Write(1);
           binaryWriter.Write(2);
           binaryWriter.Flush();

Итак, в другой части мне нужно прочитать два значения, которые я имею в виду 1 и 2;

Итак, в серверной части у меня есть этот код:

  static void Listeners()
        {

        Socket socketForClient = tcpListener.AcceptSocket();
        if (socketForClient.Connected)
        {
            NetworkStream networkStream = new NetworkStream(socketForClient);


            while (true)
            {
                  List<int> variables = new List<int>();
                using (var reader = new BinaryReader(networkStream))
                {
                    for (int i = 0; i < 2; i++)
                    {
                        int t = reader.ReadInt32();
                        variables.Add(t);
                    }
                }

      }
   }
}

Как видите, я храню значения в списке variables. Но это не работает. Я имею в виду, что в серверной части я не могу получить значения 1 и 2, и мои значения такие: 841757955

с уважением.


person Ehsan Akbar    schedule 27.06.2014    source источник
comment
Итак, как я могу изменить его на двоичный?   -  person Ehsan Akbar    schedule 27.06.2014
comment
Я бы предположил, что вы хотите прочитать данные в виде текста. В предоставленном вами коде вы создаете StreamReaders и StreamWriters, но затем, похоже, не используете их. Вместо того, чтобы использовать BinaryReader на сервере, попробуйте вместо этого использовать StreamReader.   -  person Daniel Kelley    schedule 27.06.2014
comment
Нет, я должен использовать двоичный код, но я не знаю, как я могу это сделать? я отредактирую свой пост   -  person Ehsan Akbar    schedule 27.06.2014
comment
Тогда используйте BinaryWriter вместо StreamWriter? Вопрос определенно нуждается в обновлении, и, пожалуйста, удалите неиспользуемые переменные из фрагментов кода.   -  person Daniel Kelley    schedule 27.06.2014
comment
Я обновляю сообщение. Пожалуйста, посмотрите.   -  person Ehsan Akbar    schedule 27.06.2014
comment
@Daniel: Не кажется ли вам, что отправка с помощью BinaryWriter и чтение с помощью BinaryWriter должны быть совместимы до сих пор?   -  person peter_the_oak    schedule 27.06.2014
comment
@peter_the_oak Я ожидаю, что отправка с BinaryWriter и чтение с BinaryReader будут совместимы, чего не происходило в исходной версии этого вопроса.   -  person Daniel Kelley    schedule 27.06.2014
comment
Итак, @DanielKelley, я изменил это, как вы сказали, но это не работает   -  person Ehsan Akbar    schedule 27.06.2014
comment
Мои значения, которые я получаю в отдельной части, выглядят следующим образом: 841757955   -  person Ehsan Akbar    schedule 27.06.2014
comment
Если вы отправляете 1,2, почему вы ожидаете, что принимающая сторона получит 2 целых числа? Конечно, он получит то, что вы посылаете? К сожалению, на ваш вопрос очень сложно ответить, так как неясно, что вы пытаетесь сделать.   -  person Daniel Kelley    schedule 27.06.2014
comment
@Daniel: понял, извини :-)   -  person peter_the_oak    schedule 27.06.2014
comment
Почему мои значения, которые я получаю, такие: 841757955   -  person Ehsan Akbar    schedule 27.06.2014


Ответы (2)


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

Когда вы читаете данные, вы пытаетесь получить значения Int32.

Здесь есть два варианта:

Чтение и запись данных в виде строки.

 Client code:

 binaryWriter.Write("1,2");

 Server code:

 string text = binaryReader.ReadString(); // "1,2"

ИЛИ Чтение и запись данных в виде целых чисел.

Client code:

binaryWriter.Write(10);
binaryWriter.Write(20);

Server code:

int value1 = binaryReader.ReadInt32(); //10
int value2 = binaryReader.ReadInt32(); //20
person Bas    schedule 27.06.2014
comment
Я использую ваш код, но значение, которое я получаю на сервере, выглядит так: = 855716097. Почему? - person Ehsan Akbar; 27.06.2014

и мои значения такие: 841757955

Всегда стоит ввести это число в калькулятор Windows и преобразовать его в шестнадцатеричный формат. Вы получаете 0x322C3503.

Что очень похоже на ASCII, строку из 3 символов, которая кодирует «5,2». Другими словами, ваш настоящий код совсем не похож на ваш фрагмент, на самом деле вы не используете перегрузку BinaryWriter.Write(Int32), вы использовали BinaryWriter.Write(String).

Конечно, это не сработает, вы не можете написать строку и ожидать, что она будет читаема как необработанные целые числа. Исправьте свой код.

person Hans Passant    schedule 27.06.2014
comment
Мой проект является частью другого проекта, поэтому мне нужно адаптировать свой проект к другому проекту. - person Ehsan Akbar; 27.06.2014
comment
Это скорее резкий отказ от общения. Вы вообще не понимаете этого ответа. И что еще хуже, вы не разговариваете с программистом, который работал над другим проектом. Очень трудно говорить по сети, если вы не знаете, как общаться. Если вы написали сервер, вам придется использовать BinaryReader.ReadString() - person Hans Passant; 27.06.2014
comment
Вы знаете, что они дают нам структуру своего сообщения, которое они отправляют в наше приложение, и здесь вы можете увидеть: -is-sent-by-a-server-using-socket" title="чтение переменных сообщения, отправленного сервером с использованием сокета"> stackoverflow.com/questions/24349052/ - person Ehsan Akbar; 27.06.2014
comment
картинка - это структура их сообщения - person Ehsan Akbar; 27.06.2014
comment
Господи, это касается поездов? Вы знаете, что можете убить сотню человек, если ошибетесь? Поговорите со своим начальником, вы в тупике. - person Hans Passant; 27.06.2014
comment
:). Вы знаете, это просто система мониторинга. Наш проект просто получает местоположение поездов, рассчитывает время прибытия поездов и показывает время пассажиру на ЖК-мониторе. - person Ehsan Akbar; 27.06.2014