Как установить размер буфера в клиент-серверном приложении с помощью сокетов? - PullRequest
2 голосов
/ 17 июня 2010

Прежде всего, я новичок в сети, поэтому я могу сказать глупость здесь. Рассматривая клиент-серверное приложение, использующее сокеты (.net с c #, если это имеет значение).

  1. Клиент отправляет некоторые данные, сервер обрабатывает его и отправляет обратно строка.
  2. Клиент отправляет некоторые другие данные, Служба обрабатывает его, запрашивает БД и отправляет обратно несколько сотен элементы из базы данных
  3. Клиент отправляет другой тип данные и сервер уведомляет некоторые другие клиенты

. У меня вопрос, как правильно установить размер буфера для операции чтения / записи. Должен ли я сделать что-то вроде этого: byte[] buff = new byte[client.ReceiveBufferSize]?

I am thinking of something like this:
Client sends data to the server(and the server will follow the same pattern)
byte[] bytesToSend=new byte[2048] //2048 to be standard for any command send by the client
bytes 0..1 ->command type
bytes 1..2047 ->command parameters
byte[] bytesToReceive=new byte[8]/byte[64]/byte[8192] //switch(command type)

Но ... что происходит, когда клиент получает уведомление от сервера без отправки данных? Как правильно сделать то, что я пытаюсь сделать? Спасибо за чтение.

Ответы [ 4 ]

1 голос
/ 17 июня 2010

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

Вот пример обмена сообщениями переменного размера по сети

1 голос
/ 17 июня 2010

Я не очень понимаю, что вы пытаетесь сделать, но я пытаюсь дать несколько советов. Ваш байтовый массив и свойство Socket.ReceiveBufferSize - это две разные вещи. Размер буфера не имеет значения. Вам следует использовать байтовый массив, достаточно большой для хранения данных, которые вы хотите отправить или получить. Для размера байтового массива 2048, вероятно, подходит, если вы не хотите отправлять изображения, очень большой текст и т. Д. Я выполнил простое программирование клиент-сервер, и мне было проще, если получатель знает, сколько данных нужно получить авансовый. Так, например, вы отправляете длину строки сначала как 1 или 2 байта, а затем строку, используя utf8 кодировку . Используйте метод Encoding.GetByteCount для получения размера строки в байтах для выбранной кодировки. Вы должны преобразовать числа в двоичные, используя методы из Bitconverter . Я нашел их полезными, и теперь я бы хотел, я бы открыл их раньше. Чтобы отправить другие более сложные типы данных, вы должны разбить их и отправить их как строки или числа по одному.

1 голос
/ 17 июня 2010

Неважно, каков размер вашего буфера, это должно быть просто временное хранилище для данных. Прочтите это о чтении из двоичных потоков: http://www.yoda.arachsys.com/csharp/readbinary.html

0 голосов
/ 17 июня 2010

Вы можете просто думать о XML как о протоколе вашего общения, затем вы читаете сокет, пока не будет прочитан нулевой байт. (Это типичный маркер конца XML-документа). Вы можете реализовать этот протокол двумя способами.

Для анализа и генерации XML-документа вы можете использовать XMLDocument класс. Вы должны сделать это какой-то схемой. Но если вам нужно чистое преобразование данных как XML , вы можете использовать простейшие DataSet.

...