TCP гарантирует, что данные поступают в том же порядке, в котором они были отправлены, но не имеют понятия сообщений . Например, допустим, вы отправили следующие два фрагмента данных:
1001:UN=user123&PW=123456
999:UN=user456&PW=1234
На принимающей стороне вы прочитаете 1001:UN=user123&PW=123456999:UN=user456&PW=1234
, и это может занять одно, два или более чтений. Это может даже прибыть в двух пакетах как:
1001:UN=user123&PW=12
3456999:UN=user456&PW=1234
Это заставляет очень правильно анализировать сообщение. В другом сообщении упоминается об отправке длины пакета до фактических данных, и это действительно решает проблему, поскольку вы можете точно определить, когда заканчивается одно сообщение, а начинается следующее.
В качестве примера клиент и сервер могут договориться, что каждое сообщение начинается с 4 байтов, содержащих длину сообщения. Получатель мог тогда просто:
- загрузить 4 байта точно
- преобразовать в целое число, теперь вы знаете длину оставшейся части сообщения
- прочитайте ровно столько байтов и проанализируйте сообщение
C # удобно имеет класс BitConverter
, который позволяет преобразовать целое число в байт [] и наоборот.