Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 20.12.2012, 15:39
ispovedn1k ispovedn1k вне форума
Прохожий
 
Регистрация: 20.12.2012
Сообщения: 2
Репутация: 10
По умолчанию Серверное приложение с TCPServer. Правильно закрыть соединение

Здравствуйте, товарищи!

Пишу серверное многопользовательское приложение, Delphi 7.
За основу взял пример отсюда http://softengines.ru/showthread.php?t=6863
На всякий случай продублирую код
Код:
…
type 
  TMyClientThread = class(TClientSocketThread)
    private
       FCmd: String;
       FData: String;
protected
    procedure SyncProc; override;
end; 
…
procedure  TMyClientThread. SyncProc;
begin
   if FCmd = ‘CLR’ then
     Form1.ListBox2.Clear
else
     if FCmd =’TXT’ then
       Form1.ListBox2.Items.Add(FData)
else 
    if FCmd = ‘BYE’ then begin
      Terminate;
    Form1.ListBox1.Items.Add(‘Отключился:’+ ClientSocket.RemoteHost);
  end;
  else
    if FCmd = ‘’ then
    Form1.ListBox1.Items.Add(‘Подключился:’+ ClientSocket.RemoteHost);
end;

procedure TForm1.RormCreate(Sender: TObject);
begin
      Caption:=’Сервер’;
      ListBox1.Clear;
      ListBox2.Clear;
      TcpServer1.LocalPort :=’5050’;
      TcpServer1.Active := ‘True’;
end;
procedure TForm1. TcpServer1GetThread(Sender: TObject;
       var  ClientSocketThread:  TClientSocketThread);
begin
   ClientSocketThread:= 
      TMyClientThread.Create(TcpServer1.ServerSocketThread);
end;
procedure TForm1. TcpServer1Accept(Sender: TObject;
      ClientSocket:TCustomIpClient);
begin
      with (ClientSocket.GetThreadObject as TMyClientThread) do begin
          FCmd:=’’;
          ExecuteSyncProc;
             while not Terminated do begin
                      FCmd:= ClientSocket.Receiveln;
                      if FCmd = ‘TXT’ then
                                  FData:= ClientSocket.Receiveln;
                     if FCmd <> ‘’ then
                                  ExecuteSyncProc;
      end;
   end;
end;

Итак, сам компонент TCPSocket ожидает подключения в отдельном потоке. При подключении клиента создается клиентский поток, в котором уже выполняется общение с клиентом.

Суть-вопросы.

1. Для закрытия соединения при получении команды 'BYE' используется вызов Terminate, который (как я понимаю) убивает клиентский поток. Правильно ли это? Не надо ли вызывать методы Disconnect, Close класса ClientSocket ? Проясните этот момент, кто знает.

2. Для меня сейчас более актуально разобраться в следующем:
если клиент не отправляет команду 'BYE', а просто вырубается, рвется соединение и т.п., то цикл while в TcpServer1Accept начинает бесконечно гонять по кругу. Каждый раз ClientSocket.Receiveln возвращает пустую строку. Т.е. получается, что сокет висит в каком-то неопределенном состоянии (пробовал определять эту ситуацию проверкой ClientSocket.Connected, но ничего не вышло, остается TRUE), пользовательский поток гоняет по кругу цикл, который уже ничего не сделает, хотя должен умереть.
Как правильно отследить и обработать эту ситуацию?

В общем, научите правильно закрывать соединения со стороны сервера во всех случаях. Заранее спасибо.

Последний раз редактировалось ispovedn1k, 20.12.2012 в 16:09.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:20.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter