Форум программистов, компьютерный форум, киберфорум
Delphi: Сети
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/40: Рейтинг темы: голосов - 40, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 15.01.2018
Сообщений: 28
1

Ошибка "Connection closed gracefully" при отправке пакета данных серверу

01.08.2019, 08:35. Показов 7370. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Разрабатываю навигационную программу.Возникла потребность получать координаты от нескольких пользователей программы. Использую Indy компоненты, а именно IdTCPServer и IdTCPClient. Сервер создается, клиент коннектится все нормально, при передаче данных возникает ошибка. Отправляю данные из таймера.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
procedure TDM.ServerLANExecute(AThread: TIdPeerThread);
Var
  stringData:Tstringlist;
  Str,s1: String;
  i:Integer;
begin
  stringData:=TStringList.Create;
  With AThread.Connection Do
Begin
      Str:=ReadLn; 
End;
try
while pos(';',Str)<>0 do begin
stringData.add(copy(Str,1,pos(';',Str)-1));
s1:=copy(Str,pos(';',Str)+1,maxint);
Str:=s1;
end;
for i:=0 to stringData.Count do
ANHD[0]:=stringData[0];
ANHD[1]:=stringData[1];
ANHD[2]:=stringData[2];
finally
stringData.Free;
end;
sleep(3000);
oleMapInfo.Do('Create Point Into Variable o_point_NHD (0.000,0.000) ');
oleMapInfo.Do('Insert Into cosmetic1 (Obj) Values ( o_point_NHD ) ');
oleMapInfo.Do('Alter Object o_point_NHD Geography 1, '+ANHD[1]+' ');
oleMapInfo.Do('Alter Object o_point_NHD Geography 2, '+ANHD[2]+' ');
oleMapInfo.Do('Alter Object o_point_NHD Info 2, MakeFontSymbol(35,16711680,12,"Map Symbols",48,0) ');
oleMapInfo.Do('Update cosmetic1 Set Obj = o_point_NHD  Where RowID = 2 ');
oleMapInfo.Do('Create Text "íøä" ('+FloatToStr(StrToFloat(ANHD[1])+0.000056)+','+FloatToStr(StrToFloat(ANHD[2])+0.000056)+')('+FloatToStr(StrToFloat(ANHD[1])+0.000332)+','+FloatToStr(StrToFloat(ANHD[2])+0.001586)+') Font ("Arial Cyr",259,0,0,16777215) ' );
 
end;
Этот код висит на IdTCPServer.Execute и должен выполнять основную работу.
Delphi
1
2
3
4
5
6
7
8
9
10
11
procedure TDM.DataTimerTimer(Sender: TObject);
var
  sms:string;
begin
  try
     sms:=('1'+';'+xcord+';'+ycord+';');
     DM.ClientLAN.WriteLn(sms);
  except
 ShowMessage('Не удалось отправить пакет');
  end;
end;
После оборота в try... except вылезает исключение.
Прочитал много инфы по этой теме так ничего и не нашел относящегося к проблеме. Подскажите в чем тут дело.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.08.2019, 08:35
Ответы с готовыми решениями:

"Connection closed gracefully" при отправке по ftp
IdFTP1.Disconnect; Idftp1.Connect(true,3000); idftp1.CheckForGracefulDisconnect();...

Ошибка при отправки сообщения: connection closed gracefully
Вылетает ошибка при отправки сообщения connection closed gracefully Вот код: procedure...

Ошибка в программе //Connection Closed Gracefully
var zap:string; start:textfile; filebat:string; filebat2:string; begin...

Ошибка Connection Closed Gracefully, что делать?
в коде на отправку сообшений на email вибивает ошибку Connection Closed Gracefully и процедура...

3
884 / 404 / 174
Регистрация: 20.10.2016
Сообщений: 1,828
01.08.2019, 12:50 2
Цитата Сообщение от Ginchman Посмотреть сообщение
Прочитал много инфы по этой теме так ничего и не нашел относящегося к проблеме. Подскажите в чем тут дело.
Ну, перво-наперво: Connection closed gracefully означает, что сервер вполне себе штатно закрыл соединение. То ли общаться передумал, то ли обиделся.

Далее. Логика клиент-серверной архитектуры состоит в том, что инициатор общения - это клиент. И он же должен постоянно опрашивать сервер о состоянии. Можно, конечно, правильно разработать поток, в котором работает отдельно взятое соединение, и слать в сокет периодически данные, но для этого надо понимать происходящее и быть уверенным в том, что делаешь.

Теперь по коду: непонятно что такое ClientLan. Плюс, оборот в try except у вас совершенно неинформативен: надо делать примерно так (у инди, если память не изменяет, свой класс для исключений):

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
procedure TDM.DataTimerTimer(Sender: TObject);
var
  sms:string;
begin
  try
     sms:=('1'+';'+xcord+';'+ycord+';');
     DM.ClientLAN.WriteLn(sms);
  except
   on e:EidException do
    ShowMessage('Не удалось отправить пакет. Ошибка: '+e.Message);
  end;
end;
Добавлено через 14 секунд
Цитата Сообщение от Ginchman Посмотреть сообщение
Прочитал много инфы по этой теме так ничего и не нашел относящегося к проблеме. Подскажите в чем тут дело.
Ну, перво-наперво: Connection closed gracefully означает, что сервер вполне себе штатно закрыл соединение. То ли общаться передумал, то ли обиделся.

Далее. Логика клиент-серверной архитектуры состоит в том, что инициатор общения - это клиент. И он же должен постоянно опрашивать сервер о состоянии. Можно, конечно, правильно разработать поток, в котором работает отдельно взятое соединение, и слать в сокет периодически данные, но для этого надо понимать происходящее и быть уверенным в том, что делаешь.

Теперь по коду: непонятно что такое ClientLan. Плюс, оборот в try except у вас совершенно неинформативен: надо делать примерно так (у инди, если память не изменяет, свой класс для исключений):

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
procedure TDM.DataTimerTimer(Sender: TObject);
var
  sms:string;
begin
  try
     sms:=('1'+';'+xcord+';'+ycord+';');
     DM.ClientLAN.WriteLn(sms);
  except
   on e:EidException do
    ShowMessage('Не удалось отправить пакет. Ошибка: '+e.Message);
  end;
end;
Добавлено через 3 часа 0 минут
Да, еще небольшая правка:
Delphi
18
19
20
21
22
23
for i:=0 to stringData.Count do
begin //вот эту строку забыли
ANHD[0]:=stringData[0];
ANHD[1]:=stringData[1];
ANHD[2]:=stringData[2];
end; //и вот эту
1
0 / 0 / 0
Регистрация: 15.01.2018
Сообщений: 28
02.08.2019, 10:49  [ТС] 3
Цитата Сообщение от Nanotentacle Посмотреть сообщение
Теперь по коду: непонятно что такое ClientLan. Плюс, оборот в try except у вас совершенно неинформативен: надо делать примерно так (у инди, если память не изменяет, свой класс для исключений):
ClientLAN - это как раз и есть IdTCPClient - компонент Indy.
Цитата Сообщение от Nanotentacle Посмотреть сообщение
Логика клиент-серверной архитектуры состоит в том, что инициатор общения - это клиент. И он же должен постоянно опрашивать сервер о состоянии.
Я немного другое читал о клиент-серверной архитектуре. То создается сервер, который слушает определенный порт, если на это порт приходят данные, то значит клиент подключен.

Разобрался с проблемой "Connection closed gracefull". Оказалось, что на сервере при получении данных он из потока получения данных пытался обратиться к другому потоку это вызывало исключение и сервер сбрасывал подключение.
0
884 / 404 / 174
Регистрация: 20.10.2016
Сообщений: 1,828
02.08.2019, 11:10 4
Цитата Сообщение от Ginchman Посмотреть сообщение
Разобрался с проблемой "Connection closed gracefull". Оказалось, что на сервере при получении данных он из потока получения данных пытался обратиться к другому потоку это вызывало исключение и сервер сбрасывал подключение.
Да, это вполне возможный сценарий. Главное с такой ошибкой держать в голове, что соединение не "оборвалось", а было штатно закрыто сервером по каким-либо причинам.

Цитата Сообщение от Ginchman Посмотреть сообщение
Я немного другое читал о клиент-серверной архитектуре. То создается сервер, который слушает определенный порт, если на это порт приходят данные, то значит клиент подключен.
Ну, это не совсем корректно. У TCP все крутится вокруг "тунеля". То есть, установив соединение, клиент и сервер как бы связаны невидимой нитью, поэтому корректнее говорить "если есть соединение, то клиент подключен". Это, на самом деле, тоже не на 100% правильно, так как в случае обрыва соединения ошибка обнаружится только при попытке отправить сообщение, но все же отсутствие данных не всегда означает, что клиент отключился.

Ну и просто совет: с потоками поосторожнее. Если у вас не планируется использование прям нагруженной системы, количество одновременных подключений не превышает 10-20 клиентов, и в процессе ответа нет долгих операций, то стоит подумать о том, чтобы отказаться от потоков и работать синхронно.
1
02.08.2019, 11:10
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.08.2019, 11:10
Помогаю со студенческими работами здесь

Connection Closed Gracefully
Выскакивает ошибка указанная в заголовке темы! unit Unit1; interface uses Windows,...

DE xe 10.4 Connection Closed gracefully
В последнее время просто так стала показываться такая ошибка для proxy http/s. Для socks - все...

Connection closed by gracefully
smtp.host:= 'smtp.gmail.com'; smtp.AuthType:= satDefault; smtp.Port:=port; ...

connection closed gracefully
В программе 2 таймера, иногда выскакивает ошибка &quot;connection closed gracefully&quot; как это исправить?...

Connection closed gracefully
Доброго вечера. При написании небольшого почтовика столкнулся с проблемой. Выскакивает окошко и...

DE xe 10.3.3 Connection Closed gracefully
В последнее время просто так стала показываться такая ошибка для proxy http/s. Для socks - все...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru