|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
02.02.2011, 06:43 | #1 |
Регистрация: 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; пробовал заменить tcpServer\tcpClient заменить на idTcpServer\idTcpClient результат тот же. Тестировал приложения на одной машине. Подскажите как можно решить проблему. Последний раз редактировалось loran; 02.02.2011 в 07:04. |
02.02.2011, 09:19 | #2 |
Заблокирован
Регистрация: 27.05.2010
Сообщений: 1,099
|
SendLn - это функция !!!
|
02.02.2011, 09:36 | #3 |
Регистрация: 28.08.2010
Сообщений: 3
|
|
02.02.2011, 09:53 | #4 |
Заблокирован
Регистрация: 27.05.2010
Сообщений: 1,099
|
Да нишиша ты не понял.
Функция чем от процедуры отличается ? Возвратом результата. Результат для кого и для чего функцией возвращается ? Для тебя чтобы ты его анализировал. Где у тебя анализ результата ? Нет его у тебя, отсутствует напрочь он. Ну вот и пожинай плоды) |
02.02.2011, 11:46 | #5 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
не помню, TcpServer1Accept() в контексте "главного" потока вызывается? Если нет, с мемой там работать нельзя.
Код:
Код:
Куда отправленых, в мусорку? Правильно вам mss написал, результат Sendln() надо бы анализировать. А если сокет асинхронный, то подпорка из Sleep(500); вам не поможет.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
02.02.2011, 11:50 | #6 |
Регистрация: 28.08.2010
Сообщений: 3
|
|
02.02.2011, 11:53 | #7 |
Заблокирован
Регистрация: 27.05.2010
Сообщений: 1,099
|
> TcpServer1Accept() в контексте "главного" потока вызывается?.
В контексте дополнительного, если автор не менял св-во BlockMode. А он его скорее всего не менял шлепнув сервер на форму. А по дифолту оно = thread-blocking Граблищи во весь лоб) |
02.02.2011, 11:57 | #8 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
Тогда это только вопрос времени, когда мемо на сервере поломается, и тут появится новая тема, ну или эта поднимется )
> проблема решена Какая именно? У вас их штук 5 )
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
02.02.2011, 12:00 | #9 |
Заблокирован
Регистрация: 27.05.2010
Сообщений: 1,099
|
> У вас их штук 5
Больше) Mess := ClientSocket.Receiveln; while Mess <> '' do // а клиент взял да прислал "пустую" (CRLF) строку ! А сервер с перепугу взял да отключил клиента) |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Работа с 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 |