TWSocket.OnSessionClosed

From Overbyte
Jump to: navigation, search

This event is fired when the connection is closed or lost/broken.

This is the place you may initiate a TimeSetEvent TIME_ONESHOT that could attempt to reconnect some seconds later in case of Error<>0

If session is properly closed server side for some minutes, they Server may send a "please reconnect in xxx minutes" or "closed because of maintenance until xx:yy" just before before closing session so the Client may try reconnect a few minutes later or display a clean message.

 // Sample of TimeSetEvent CallBack procedure
 procedure TimeCallBackReconnect(TimerID, Msg:Uint; dwUser, dw1, dw2: DWord);   pascal;
 begin
   PostThreadMessage(ThreadConnector.ThreadID,WM_CONNECT2SERVER,0,0);
 end;
 // Sample of SessionClosed event 
 procedure TMyThread.WSocket2ServerSessionClosed(Sender: TObject; ErrCode: Word);
 begin
   if (Errcode<>0)
   // Set to true or false as needed
   and (WSocket2Server.RetryConnect=true)
   // Max attempts, think to reset to 0 once connected again
   and (WSocket2Server.RetryCount<WSocket2Server.MaxRetry)
   then
     if TimeSetEvent(WSocket2Server.RetryDelay,100,@TimeCallBackReconnect,0,TIME_ONESHOT)=0
     then LogConnector('TimeSetEvent creation Error'); 
 end
 else
 begin
   // You may try some reconnect also if clean close and server told
   // it is off for some minutes.
   // Server may also have informed you to reconnect somewhere else
   // during maintenance
 end;
 // Sample of WM_CONNECT2SERVER event 
     WM_CONNECT2SERVER:
     begin
       try          
         if WSocket2Server.State <> wsClosed
         then WSocket2Server.close;
         inc(WSocket2Server.RetryCount);
         WSocket2Server.Port:=StringListConfigFile.Values['ServerPort'];
         WSocket2Server.Addr:=StringListConfigFile.Values['ServerAddr'];
         WSocket2Server.Connect;
       except
         // Yes you may have an error with no SessionClosed
         // For example if a local firewall is blocking socket
         on E: Exception do
         begin
           LogConnector(E.Message);
           if TimeSetEvent(WSocket2Server.RetryDelay,100,@TimeCallBackReconnect,0,TIME_ONESHOT)=0
           then LogConnector('TimeSetEvent creation error');
           // WSocket2Server.RetryDelay may be altered if Server
           // sent some 'server will be off for xxx minutes'
           // just before a clean close
         end;
       end;
     end;