Мне нужен эффективный для памяти и времени способ разделения входящего потока данных на основе разделителя.Поток является сетевым потоком, и поступающие «сообщения» делятся на CRLF
.Ранее я делал это путем преобразования входящих данных в строку с использованием UTF8, затем проверял CRLF, и, если он существует, я делю его на основе этого, однако, это не очень хороший способ решения проблемы, так как все больше и больше сообщенийвходящие.Кроме того, я мог бы получить блоки данных, содержащие 1 сообщение, и я мог бы получить блоки данных, содержащие 10 сообщений, и даже те, которые содержат только части сообщений.
Так что это то, что я придумал до сих пор.Используйте поток памяти для буфера, и когда данные поступают, считывают данные в поток памяти.Если я нахожу разделитель (CRLF), я беру все данные в потоке памяти и вызываю сообщение «Получено», затем я продолжаю.Есть мысли по этому поводу?
[Редактировать]
Хорошо, я думаю, мне нужно лучше объяснить, что я хочу сделать.Используемый протоколл - это IRC-протоколл, который отправляет «сообщения» или «команды», если хотите, отделенный CRLF
.Я использую класс сокетов в C # с BeginReceive и EndReceive, поэтому все работает асинхронно.Класс, который я пишу, называется MessageConnection.Он получает данные из tcp-сокета, и когда бы ни был найден данный разделитель (в данном случае CRLF
), я хочу, чтобы он вызывал функцию OnMessage, которая принимает полученное сообщение в качестве параметра.Я решил точно такую же проблему, прежде чем использовать StringBuilder в качестве буфера и добавлять новую строку в StringBuilder всякий раз, когда получал данные, затем я разделял строку, возвращенную StringBuilder, на основе разделителя, очищал StringBuilder ивставить последнюю часть операции split.После этого я делаю цикл через split-массив (без последнего элемента) и вызываю OnMessage.Это похоже на неэффективный способ решения проблемы, потому что я много конвертирую в и из строк - что, как говорят, не очень хорошо, поэтому я подумал, что должен быть простой способ решить эту проблему, не имеядумать в строках, только в байтовых массивах, и преобразовывать в строку только тогда, когда у меня есть байтовый массив, представляющий фактически все «сообщения», и это то, с чем я хочу помочь.