Чтение переменных сообщения, отправленного сервером с использованием сокета

Я работаю над информационной системой для пассажиров PIS (поезд). Поэтому поезда отправляют свое местоположение на мой сервер PIS, используя сокет на порту 8080. Так что я должны получить их местоположения и показать их пассажирам. Сообщение, которое приходит от поездов, имеет шаблон, которому я должен следовать. Как вы можете видеть здесь:

введите здесь описание изображения

Как видите, у нас есть 6 переменных.Каждое целое число занимает 4 байта. Первая переменная (4 байта) источник сообщения и т.д.

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

 static void Listeners()
        {

            Socket socketForClient = tcpListener.AcceptSocket();
            if (socketForClient.Connected)
            {
                Console.WriteLine("Client:" + socketForClient.RemoteEndPoint + " now connected to server.");
                NetworkStream networkStream = new NetworkStream(socketForClient);
                System.IO.StreamWriter streamWriter =
                new System.IO.StreamWriter(networkStream);
                System.IO.StreamReader streamReader =
                new System.IO.StreamReader(networkStream);

                while (true)
                {

                    TimeTableRepository objTimeTableRepository = new TimeTableRepository();
                    SensorRepository objSensorRepository = new SensorRepository();
                    ArrivalTimeRepository objArrivalTimeRepository=new ArrivalTimeRepository();
                    TrainRepository objTrainRepository = new TrainRepository();
                   // OnlineTrainRepository ObjOnlineTrainrepository = new OnlineTrainRepository();

                    //-----
                    string theString = streamReader.ReadLine();

                }
         }
}

Вот мой слушатель для порта 8080, а theString — это сообщение, отправляемое поездами. Моя проблема в том, как я могу определить эти параметры (источник сообщения, пункт назначения сообщения и т. д.) from theString? Я имею в виду, что мне нужно их значение для хранения в базе данных.

с уважением


person Ehsan Akbar    schedule 22.06.2014    source источник


Ответы (1)


Похоже, вам не нужно ничего обнаруживать, и определенно не следует не помещать это в строку, чтобы попытаться проанализировать.

Вы уже знаете, что получаете кучу целых чисел. Вы даже знаете, в каком порядке они расположены. Используйте BinaryReader, чтобы получить ваши цифры и продолжить оттуда. После того, как вы загрузите свой ридер, это должно быть так же просто, как вызвать BinaryReader.ReadInt32(), чтобы прочитать номера сообщений один за другим.

Я также настоятельно рекомендую вам ознакомиться с операторами using для ваших потоков.

using (var reader = new BinaryReader(networkStream))
{
    var messageSource = reader.ReadInt32();
    var messageDestination = reader.ReadInt32();

    ... and so on ...
}
person TyCobb    schedule 22.06.2014
comment
@ЕА Готово. Также есть пример по ссылке, которую я предоставил в документе MSDN. - person TyCobb; 22.06.2014
comment
Только один вопрос: моя длина целого числа статична. Должен ли я использовать это: pos += sizeof(int); - person Ehsan Akbar; 22.06.2014
comment
@EA Нет. BinaryReader уже должен справиться с этим за вас. Каждый раз, когда вы вызываете ReadInt32(), он автоматически перемещает его на 4 байта, потому что это размер 32-битного целого числа. Вам не нужно перемещаться вручную, если только вам не нужно пропустить x количество байтов. - person TyCobb; 22.06.2014
comment
у меня проблема с чтением двоичных данных, если это возможно, посмотрите: stackoverflow.com/questions/24448304/ - person Ehsan Akbar; 27.06.2014