На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Соблюдайте общие правила форума
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Указывайте точные версии Delphi и используемых сетевых библиотек.

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

Внимание:
попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Krid, user posted image Rouse_

Модераторы: Krid, Rouse_
  
> Передача данных между StringGrid'ами от клиента к серверу
    Подскажите как решить задачу. Собственно, на сервере и клиенте есть StringGrid с одинаковым количеством столбцов (5) и строк. Клиенту нужно отправить на сервер данные конкретной строки.
    Делаю так, но на сервере все данные принимаются в одну ячейку скопом.

    На клиенте:
    ExpandedWrap disabled
      procedure TForm1.Button1Click(Sender: TObject);
      var
        cc, rc, c, r: Integer;
      begin
        cc := Form1.StringGrid1.ColCount;
        rc := Form1.StringGrid1.RowCount;
        for r := 1 to rc -1 do
          for c := 0 to cc -1 do
        Form1.ClientSocket1.Socket.SendText(Form1.StringGrid1.Cells [c,r]);
      end;

    На сервере:
    ExpandedWrap disabled
      procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
        Socket: TCustomWinSocket);
      var
        cc, rc, c, r: Integer;
      begin
        cc := Form1.StringGrid1.ColCount;
        rc := Form1.StringGrid1.RowCount;
        for r := 1 to rc -1 do
          for c := 0 to cc -1 do
        Form1.StringGrid1.Cells [c,r] := Socket.ReceiveText;
      end;
      а) Данные по сети передаются не в том порядке, в котором отправляются
      б) Они могут склеиваться в единые фрагменты, а могут наоборот (если больше мту) фрагментироваться.
      с) Из первых двух пунктов => Ваш алгоритм никогда не отработает так как надо.

      Добавлено
      А если и отработает то это чисто случайность.
        GrabbeR, с учетом того что сказал Gonarh, Вам надо отправлять не только текст ячеек, но и координаты ячеек
        что-то вроде такого:
        Form1.ClientSocket1.Socket.SendText(IntToStr®+','+IntToStr©+','+Form1.StringGrid1.Cells[c,r]);
        ну и при получении сначала выделять из строки координаты ячейки, а потом уж в соотв. ячейку писать текст...
          Цитата Gonarh @
          а) Данные по сети передаются не в том порядке, в котором отправляются

          Это как это?
            Настроенный QoS на роутерах приоритезирует пакеты. Предложение сформулировал неверно :blush:
              Хорошо, а если на клиенте заменить StringGrid на пару Edit'ов. Как отправить данных из двух сразу, чтобы они попали в разные ячейки StringGrida'a, а не в одну? Делаю так.

              На клиенте:
              ExpandedWrap disabled
                Form1.ClientSocket1.Socket.SendText(Edit1.Text);
                Form1.ClientSocket1.Socket.SendText(Edit2.Text);


              На сервере:
              ExpandedWrap disabled
                Form1.StringGrid1.Cells [0,1] := Socket.ReceiveText;
                Form1.StringGrid1.Cells [1,1] := Socket.ReceiveText;
                Неправильно делаешь. neut ral подсказал как надо.
                  Цитата Gonarh @
                  Настроенный QoS на роутерах приоритезирует пакеты. Предложение сформулировал неверно

                  Разве что для нескольких подключений, но не внутри же одного
                    Может подскажет кто примером как сделать через разделитель? Буду крайне благодарен!
                    Сообщение отредактировано: GrabbeR -
                      Цитата GrabbeR @
                      Может подскажет кто примером как сделать через разделитель?


                      Ну, тут типовая ошибка при работе с сокетами - пытаться кидаться данными, отталкиваясь от UI. Подумайте о передаваемых через сокет данных как о выборке из базы: таблицы, колонки, строки. Ну, и длину данных, сколько ожидать для вычитки, тоже считается хорошим тоном передать в заголовке. Итого, Вам нужно нарисовать хоть простенький, но протокол приёма-передачи. Для примера гляньте на HTTP (а то и вообще берите его как основу, будет эдакий REST API style :) )

                      Клиент говорит
                      Цитата
                      PUT mygrid?col=5&row=8
                      Content-Length: 32055
                      <пустая строчка>
                      ...далее бинарный поток с данными...


                      Сервак это парсит.

                      Бинарный поток данных - опять же, можно дробить на заголовки строк и сами строки, а их уже на заголовки колонок и сами ячейки.
                        Цитата Fr0sT @
                        Цитата Gonarh @
                        Настроенный QoS на роутерах приоритезирует пакеты. Предложение сформулировал неверно

                        Разве что для нескольких подключений, но не внутри же одного

                        Не обязательно, можно хоть в каждом пакете менять DSCP флаг, только зачем? :D
                        1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                        0 пользователей:


                        Рейтинг@Mail.ru
                        [ Script execution time: 0.0905 ]   [ 15 queries used ]   [ Generated: 20.09.26, 19:48 GMT ]