Q&A

  • indyclient에서 잘되다가 어느순간 서버와 연결이.. close ConnClosed Gracefully 라면서 끊어 져요 도와주세요
인디를 쓰고 있는데요
indy 9.2.1.7 버전을 쓰고 있는데요


서버가 있고 클라이언트가 2개 연결을 해서 테스트를 하고 있는데


잘 되다가 중간에 클라이언트가 튕겨져 나가네요..  뭐가 문제인지 모르겟습니다

클라이언트는 끊어져서는 정말 안되거든요

재접속하는 방법이 있다고 하는데 좀 알려주세요 그리고

밑에 제가 한소스인데 뭐가 문제인지 좀 알려주세요

제가 테스트 한결과 서버에서 DB 작업을 하고 나서 Packet를 보낼때

문제가 발생 하는거 같아요

내용은  client 2개를 서버에 접속해 채팅를 하면  2초간격으로 타임을 가져오는데 가져오다가 클라이언트가 한개가
튕겨 서버와 끊어지면 다른 또 클라이언트는 끊어지지는 않았는데

서버에서 2초간격으로 받는타임 부분이 멈춥니다. 그래서 제 생각에 그분이 문제 인거

같은데 그래서 부분을 정리해소 올립니다


꼭 봐주시구요 고수님들의 좋은 답변 부탁드립니다


client는 따로 쓰레드를 만들어서 밑에처럼 처리하구요


procedure TS_ClientRecvThread.Execute;

begin
{ Place thread code here }


try
  while TelePhone.TCPClient.Connected and not Terminated do
       begin
       strMsg := TelePhone.TCPClient.ReadLn('', IdTimeoutInfinite);
       GTrace('[Unit1.pas] TelePhone.TCPClient.ReadLn=%s', [strMsg]);
       if strMsg = '' then
        begin
             continue;
        end;
               Synchronize(RecvPacket);
       end;



except
  on E: EIdConnClosedGracefully do
       begin
        telephone.ShowMsg('접속이 비정상적으로 종료되었습니다.');
       end;
    on E: EIdSocketError do
       begin
       end;
  end;

if not Terminated then Terminate;

end;


procedure TS_ClientRecvThread.RecvPacket;
var
i:integer;

begin


  try
   Packet := TStringList.Create;
   PacketDetail := TStringList.Create;
   Packet.Clear;
   ExtractStrings([#0], [' '], PChar(strMsg), Packet);

   for i:=0 to Packet.Count-1 do
   begin

     PacketDetail.Clear;
     ExtractStrings(['|'], [' '], PChar(Packet.Strings[i]), PacketDetail );

     if PacketDetail.Strings[0]  ='UserList' then
     begin
     UserList;
     end;

   // 이부분이 서버에서 타임 시간 받는 부분 그래서 라벨에 뿌려줌  
   if PacketDetail.Strings[0] = 'CashpriceR' then
     begin
        TelePhone.Label1.Caption := Trim(PacketDetail.Strings[1]);
     end;


end;
   finally
   Packet.Free;
   PacketDetail.Free;
   end;


서버는밑에 처럼 처리합니다


procedure TSV_Main.TCPServerExecute(AThread: TIdPeerThread);
var

Packet, PacketDetail: TStringList;
i,j,k,l,m,p:integer;
MYList :  TMyCollectionItem;
m_SQLTEXT,Msg,buffer : string;

begin



if not AThread.Terminated and AThread.Connection.Connected then
  begin

  Msg :=  AThread.Connection.ReadLn;

  GTrace('[Server.pas] TForm1.Msg Msg=%s', [Msg]);

  if Msg <> '' then
  begin

  
//////////////////////////////// 서버에 연결 ////////////////////////

   Packet := TStringList.Create;
   PacketDetail := TStringList.Create;

   try

   Packet.Clear;
   ExtractStrings([#0], [' '], PChar(Msg), Packet);

   for i:=0 to Packet.Count-1 do
   begin

     PacketDetail.Clear;
     ExtractStrings(['|'], [' '], PChar(Packet.Strings[i]), PacketDetail );


      if PacketDetail[0] ='CONN' then
      begin


         with CheckQuery do Begin
           Close;
           m_SQLTEXT := '';
           m_SQLTEXT := 'select * from cust;
           Sql.Clear;
           Sql.Text := m_SQLTEXT;
           open;
          
               MYList := FMyComponent.Items.Add;
               MYList.state:= PacketDetail.Strings[5]
               MYList.ip := PacketDetail.Strings[6];
               MYList.sex := Trim(CheckQuery.Recordset.Fields[0].Value);
               MYList.age := Trim(CheckQuery.Recordset.Fields[2].Value);
               MYList.city := Trim(CheckQuery.Recordset.Fields[3].Value);
               MYList.meet := Trim(CheckQuery.Recordset.Fields[4].Value);
               MYList.tolk := Trim(CheckQuery.Recordset.Fields[5].Value);
               MYList.ListLink :=  lbClients.Items.Count;
               MYList.Thread :=  AThread;
               lbClients.Items.Add( PacketDetail.Strings[2] +'['+  PacketDetail.Strings[5]+']');
               AThread.Data := MYList;
           end;



       end;



if PacketDetail.Strings[0] = 'CashPrice' then
     begin
      
       UserCashPrice(PacketDetail.Strings[1],PacketDetail.Strings[2],PacketDetail.Strings[3],AThread);

     end;

    
  
end;
   finally
   Packet.Free;
   PacketDetail.Free;
end;

end;
end;



// 이부분이 서버에서 클라리언트에게 타임 차감하고 보내주는 부분입니다
procedure TSV_Main.UserCashPrice(custcd : string; userid : string; cash: string; AThread : TIdPeerThread);

var m_SQLTEXT, Ncash : string;

  j : integer;

begin

      with CashQuery do begin
       Close;
       SQL.Clear;
       sql.Add('update Cust set MSTART = MSTART - :a2 where cd =:a1');
       Parameters.ParamByName('a1').value := cd;
       Parameters.ParamByName('a2').value := cash;
       CashQuery.ExecSQL;

         m_SQLTEXT := '';
         m_SQLTEXT := 'select custcd,mstart from cust where cd = '+ cd;
         Sql.Clear;
         Sql.Text := m_SQLTEXT;
         open;
         Ncash := CashQuery.Recordset.Fields[1].Value;
      end;

   AThread.Connection.WriteLn('CashpriceR|'+Ncash);





end;
0  COMMENTS