Класс Socket разбивает текст при отправке - PullRequest
0 голосов
/ 14 февраля 2012

Я использую класс Socket для отправки текстового сообщения на удаленный сервер с помощью метода Send ().

Отправляемый текст не имеет перерывов:

"The|string|that|is|being|sent|"

но удаленный сервер получает его как

"The|st"
""
"ring|t"
""
"hat|is"
""
"|being"
""
"|sent|"

Есть ли в классе Socket параметр, который может это предотвратить?

Ответы [ 2 ]

2 голосов
/ 14 февраля 2012

Это нормальное поведение для TCP (которое я предполагаю, что вы используете) - вы не имеете никакого реального контроля над тем, как пакеты фрагментируются, это только гарантирует, что пакеты будут доставлены в том же порядке.

Обычно приложения отправляют символ завершения (например, символ новой строки), чтобы указать, что было отправлено одно сообщение, а новые данные принадлежат следующему сообщению.

Интересно, откуда вы берете эти пустые строки - поскольку сообщение в 0 байтов указывает на то, что другая сторона хочет закрыть соединение.

1 голос
/ 14 февраля 2012

Короткий ответ - нет.

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

Вы должны определить, что ваше сообщение должно иметь либо начальную и конечную последовательность символов, либо начальную последовательность с известным размером сообщения.

Для TCP естественно разделить сообщения, но данные всегда будут поступать в правильном порядке.

...