Прежде всего, TCP-соединения являются потоками, поэтому нет никаких обещаний, что отправленные «сообщения» будут получены как эквивалентные «сообщения» на принимающей стороне.Вещи, которые отправляются, могут быть разделены или объединены как часть нормального поведения TCP, даже до рассмотрения поведения Perl 6.Все, что требует абстракции «сообщений», должно создавать его поверх потока TCP (например, отправляя данные в виде строк или отправляя размер в байтах с последующими данными).
В Perl6, данные, поступающие через сокет, отображаются как Supply
.A whenever $conn { }
- это сокращение от whenever $conn.Supply { }
(whenever
приведет к тому, что ему дано в Supply
).По умолчанию Supply
является символьным, декодированным как UTF-8 в поток Perl 6 Str
.Как уже отмечалось в ответе, который вы уже получили, строки в Perl 6 работают на уровне графемы, поэтому он сохранит символ в случае, если следующая вещь, которая появляется по сети, является символом объединения.Это «усечение», которое вы испытываете.(Есть некоторые вещи, которые никогда не могут быть объединены . Например, \n
никогда не может иметь объединенный символ, помещенный на него. Это означает, что линейно-ориентированные протоколы не встретят такого рода поведение, иможет быть реализовано как просто whenever $conn.Supply.lines { }
.)
Существует несколько доступных опций:
- Do
whenever $conn.Supply(:bin) { }
, которые будут доставлять двоичные Blob
объекты, которые будут соответствоватьна что ОС перешла на ВМ.Это может быть тогда .decode
, как хотелось бы.Это, вероятно, ваш лучший выбор. - Укажите кодировку, которая не поддерживает комбинирование символов, например
whenever $conn.Supply(:enc('latin-1')) { }
.(Тем не менее, обратите внимание, что, поскольку \r\n
- это 1 графема, то, если сообщение заканчивается на \r
, то оно будет задержано, если следующий пакет будет сопровождаться \n
).
В обоих случаях все еще возможно разделение сообщений во время передачи, но это (полностью и в основном, соответственно) позволит избежать требования "оставайся одним", которое влечет за собой нормализация графемы.