Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.02.2011, 06:43   #1
loran
 
Регистрация: 28.08.2010
Сообщений: 3
По умолчанию Delphi2010 tcpServer/tcpClient потери сообщений при передаче

Добрый день всем
Вопрос следующий пытаюсь передавать данные и команды в строковом формате между приложениями при многократном вызове одной и той же процедуры получаю потерю сообщений, а при попытке создания лога на стороне клиента в memo периодически выскакивает ошибка 'Out of memory'

код на стороне клиента
Код HTML:
procedure TfmMain.TcpServer1Accept(Sender: TObject;
  ClientSocket: TCustomIpClient);
begin
    Mess := ClientSocket.Receiveln;
    while Mess <> '' do
      begin
        Memo1.Lines.Add(Mess);// лог полученных строк
        rMessseg.CodTask := copy(Mess,1,Pos('|',Mess)-1);
        Delete(Mess,1,Pos('|',Mess));

        case StrToInt(rMessseg.CodTask) of
        11: SprPersoneClear;
        1: SprPersoneAdd;
        12: prJurNoLookTaskClear;
        2: prAddJurNoLoockTask;
        13: prNewUser;
        3: prAddJurTaskPersone;
        end;

        Mess := ClientSocket.Receiveln;

     end;

end;
код на стороне сервера
Код HTML:
procedure TfmMain.SendPersoneList;

begin
    try
      Mess := '';
      DMMain.ADOQSprUser.Active := true;
      DMMain.ADOQSprUser.First;
      with TcpClient1 do
        begin
          RemoteHost := rMessseg.IP;
          Active := true;
        end;
      TcpClient1.Sendln('11|*');
      TcpClient1.Active := false;
      if TcpClient1.Connect then

      while not DMMain.ADOQSprUser.Eof do
        begin
           mess := rMessseg.CodTask + '|' + DMMain.ADOQSprUserStatusWork.AsString + '|' +
                   DMMain.ADOQSprUserCodPersone.AsString + '|' + DMMain.ADOQSprUserShortName.AsString + '|' +
                   DMMain.ADOQSprUserTelefon.AsString + '|' + DMMain.ADOQSprUserPost.AsString + '|*' ;
           TcpClient1.Sendln(mess);
           Memo1.Lines.Add(mess); //лог отправленных строк
           Sleep(500);
           DMMain.ADOQSprUser.next;
        end;
     // TcpClient1.Sendln('99');
      TcpClient1.Disconnect;
    finally
      DMMain.ADOQSprUser.Active := false;
    end;
    RecClear;

end;
среда работы Windows7 Delphi® 2010 Version 14.0.3593.25826

пробовал заменить tcpServer\tcpClient заменить на idTcpServer\idTcpClient результат тот же. Тестировал приложения на одной машине.
Подскажите как можно решить проблему.

Последний раз редактировалось loran; 02.02.2011 в 07:04.
loran вне форума Ответить с цитированием
Старый 02.02.2011, 09:19   #2
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

SendLn - это функция !!!
mss вне форума Ответить с цитированием
Старый 02.02.2011, 09:36   #3
loran
 
Регистрация: 28.08.2010
Сообщений: 3
По умолчанию

Цитата:
Сообщение от mss Посмотреть сообщение
SendLn - это функция !!!
это я понял. непонятно почему она работает нестабильно
loran вне форума Ответить с цитированием
Старый 02.02.2011, 09:53   #4
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
Сообщение от loran Посмотреть сообщение
это я понял
Да нишиша ты не понял.
Функция чем от процедуры отличается ? Возвратом результата.
Результат для кого и для чего функцией возвращается ? Для тебя чтобы ты его анализировал.
Где у тебя анализ результата ? Нет его у тебя, отсутствует напрочь он.
Ну вот и пожинай плоды)
mss вне форума Ответить с цитированием
Старый 02.02.2011, 11:46   #5
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

не помню, TcpServer1Accept() в контексте "главного" потока вызывается? Если нет, с мемой там работать нельзя.

Код:
TcpClient1.Sendln('11|*');
TcpClient1.Active := false;
Типа "а давайте проверим, успеет/не успеет отослать"? ) Если сокет асинхронный, получите граблю в голову. Да и решение создавать новое соединение.. мягко скажем, не оправдано.

Код:
while not (не всю базу утянули) do
        begin
           mess := 'blah blah';
           TcpClient1.Sendln(mess);
           Sleep(500); // наивно.. особенно, если сокет синхронный
        end;
> Memo1.Lines.Add(mess); //лог отправленных строк

Куда отправленых, в мусорку? Правильно вам mss написал, результат Sendln() надо бы анализировать. А если сокет асинхронный, то подпорка из Sleep(500); вам не поможет.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 02.02.2011, 11:50   #6
loran
 
Регистрация: 28.08.2010
Сообщений: 3
По умолчанию

Цитата:
Сообщение от mss Посмотреть сообщение
Где у тебя анализ результата ? Нет его у тебя, отсутствует напрочь он.
Ну вот и пожинай плоды)
спасибо, таранный намек на мою невежественность принес положительные плоды проблема решена
loran вне форума Ответить с цитированием
Старый 02.02.2011, 11:53   #7
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

> TcpServer1Accept() в контексте "главного" потока вызывается?.

В контексте дополнительного, если автор не менял св-во BlockMode.
А он его скорее всего не менял шлепнув сервер на форму.
А по дифолту оно = thread-blocking

Граблищи во весь лоб)
mss вне форума Ответить с цитированием
Старый 02.02.2011, 11:57   #8
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Тогда это только вопрос времени, когда мемо на сервере поломается, и тут появится новая тема, ну или эта поднимется )

> проблема решена

Какая именно? У вас их штук 5 )
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 02.02.2011, 12:00   #9
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

> У вас их штук 5

Больше)

Mess := ClientSocket.Receiveln;
while Mess <> '' do // а клиент взял да прислал "пустую" (CRLF) строку ! А сервер с перепугу взял да отключил клиента)
mss вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с TCPClient и TCPServer BoT_T Работа с сетью в Delphi 4 20.09.2010 21:34
TCPServer, TCPClient seobot Общие вопросы Delphi 2 03.05.2010 23:56
Передача файлов(exe) при помощи TCPServer и TCPClient Air Работа с сетью в Delphi 6 26.12.2008 23:26
TcpClient и TcpServer DOLBY Работа с сетью в Delphi 5 17.12.2007 10:43
TCPServer и TCPClient Antoha Работа с сетью в Delphi 19 06.10.2007 12:01