⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 msgconnection.pas

📁 Delphi MsgCommunicator 2-10 component.I ve used, really good job. can be Server-Client message appl
💻 PAS
📖 第 1 页 / 共 5 页
字号:
                          Count:  Integer
                         );
    procedure OnDisconnect(
                             FromHost:  String;
                             FromPort:  Integer;
                             Recv:      Boolean = False
                             );
{$IFDEF API_NETWORK}
    procedure OnDataReceived(
                             Buffer:    PChar;
                             Count:     Integer;
                             FromHost:  String;
                             FromPort:  Integer
                             );
{$ELSE}
 {$IFDEF D6H}
    procedure OnDataReceived(
                             Sender:   TObject;
                             AData:    TStream;
                             ABinding: TIdSocketHandle
                             );
 {$ELSE}
    procedure OnDataReceived(
                             Sender: TComponent;
                             BufferSize: Integer;
                             FromIP: string;
                             Port: integer
                             );
 {$ENDIF}
{$ENDIF}
   public
    property RemoteHost: String read GetRemoteHost write SetRemoteHost;
    property RemotePort: Integer read GetRemotePort write SetRemotePort;
    property LocalHost: String read GetLocalHost write SetLocalHost;
    property LocalPort: Integer read GetLocalPort write SetLocalPort;
    property LocalClientID: Integer read FLocalClient write FLocalClient;
  end; // TMsgNetwork



////////////////////////////////////////////////////////////////////////////////
//
// TMsgBaseConnectionManager
//
////////////////////////////////////////////////////////////////////////////////

  TMsgBaseConnectionManager = class (TObject)
   private
{$IFDEF CONNECTION_TEST}
    FOtherManager:    TObject;
{$ELSE}
 {$IFDEF NETWORK_TEST}
    FOtherManager:    TObject;
    FClient:          Boolean;
 {$ENDIF}
{$ENDIF}
    FCSect:           TRTLCriticalSection;
    FSessionID:       TMsgSessionID;
    FListenerStoped:  Boolean;
   public
    FSessions:        TThreadList;
    FThreadCount:     Integer;
   protected
    procedure IncThreadCount(Ignore: Boolean = False);
    procedure DecThreadCount(Ignore: Boolean = False);
    procedure SetThreadCount(Value: Integer);
   private
    procedure NetworkListener(
                               Buffer:        PChar;
                               BufferSize:    Integer;
                               Network:       TMsgNetwork;
                               FromHost:      String;
                               FromPort:      Integer
                              ); virtual; abstract;
    procedure OnDisconnect(
                               FNetwork:      TMsgNetwork;
                               FromHost:      String;
                               FromPort:      Integer
                              ); virtual; abstract;
    procedure CompressAndEncryptBuffer(
                        Session:              TMsgComBaseSession;
                        InBuffer:             PChar;
                        InBufferSize:         Integer;
                        var OutBuffer:        PChar;
                        var OutBufferSize:    Integer
                                        );
    function DecompressAndDecryptBuffer(
                        Session:              TMsgComBaseSession;
                        var Buffer:           PChar;
                        var BufferSize:       Integer
                                        ): Boolean;
   public
    property ThreadCount: Integer read FThreadCount write SetThreadCount;
  end; // TMsgBaseConnectionManager



////////////////////////////////////////////////////////////////////////////////
//
// TMsgClientConnectionManager
//
////////////////////////////////////////////////////////////////////////////////

{$IFDEF CLIENT_VERSION}
  TMsgClientConnectionManager = class (TMsgBaseConnectionManager)
   private
    FConnections:     TThreadList;
    FConnectionID:    TMsgConnectionID;
    FApplication:     String;
    FMaxThreadCount:  Integer;
    FReceiveTimeOut:  Integer;
    procedure PacketResendRequest(
                               Buffer:        PChar;
                               Network:       TMsgNetwork;
                               RemoteHost:    String;
                               RemotePort:    Integer;
                               PacketID:      Integer = -1;
                               Msg:           Boolean = False
                                 );
    procedure SendConnectRequest(ClientSession: PMsgClntSession);
    procedure SendDisconnectRequest(ClientSession: PMsgClntSession;
                                    WaitForAnswer: Boolean = True);
    procedure SendPing(ClientSession: PMsgClntSession);
    procedure SendAcknowledgement(ClientSession: PMsgClntSession;
                                  Msg: Boolean = False;
                                  CurrentRequestID:     Integer = -1);
{$IFDEF MsgCommunicator}
    function IsAuthorizationBufferValid(
                      CryptoInfo: TMsgCryptoInfo;
                      Buffer:     PChar;
                      BufferSize: Integer
                                    ): Boolean;
    procedure SendConnectAckn(
                          ClientSession:        PMsgClntSession;
                          ClientConnection:     PMsgClntConnection;
                          CurrentRequestID:     Integer = -1
                              );
{$ENDIF MsgCommunicator}
    procedure DoDisconnect(Session: TMsgComBaseSession);
    procedure TerminateAllSessionThreads(ClientSession: PMsgClntSession);
    procedure TerminateMessageThreads(ClientSession: PMsgClntSession);
    procedure TerminateCommandThreads(ClientSession: PMsgClntSession);
    procedure DeleteSession(ClientSession: PMsgClntSession);
    procedure OnDisconnect(
                               FNetwork:      TMsgNetwork;
                               FromHost:      String;
                               FromPort:      Integer
                              ); override;
    procedure NetworkListener(
                               Buffer:        PChar;
                               BufferSize:    Integer;
                               Network:       TMsgNetwork;
                               FromHost:      String;
                               FromPort:      Integer
                              ); override;
    procedure DoSendBuffer(
                          ClientSession:    PMsgClntSession;
                          ClientConnection: PMsgClntConnection;
                          Buffer:           PChar;
                          BufferSize:       Integer;
                          Code:             Integer = MsgNewRequest
                         );
    // if encryption algorithm <> msg_Cipher_None then allocate buffer, fill it and return size
    // otherwise return BufferSize = 0
    procedure CreateAuthorizationBuffer(
                          CryptoInfo:     TMsgCryptoInfo;
                          out Buffer:     PChar;
                          out BufferSize: Integer
                                        );
   public
    constructor Create;
    destructor Destroy; override;
    procedure TuneConnectionParamaters(ClientSession:  PMsgClntSession);
    procedure Connect(Session: TMsgComBaseSession;
                          ListenOnly: Boolean = False;
                          Tune: Boolean = True
                          );
    procedure Disconnect(Session: TMsgComBaseSession; ListenOnly: Boolean = False);
    procedure DisconnectAll;
    procedure SendBuffer(
                          Session:    TMsgComBaseSession;
                          Buffer:     PChar;
                          BufferSize: Integer;
                          Code:       Integer = MsgNewRequest
                          );
    procedure ReceiveBuffer(
                          Session:        TMsgComBaseSession;
                          var Buffer:     PChar;
                          var BufferSize: Integer
                          );
    procedure SendMessage(
                          Session:    TMsgComBaseSession;
                          Buffer:     PChar;
                          BufferSize: Integer
                          );
    procedure ReceiveMessage(
                          ClientSession:  PMsgClntSession;
                          var Buffer:     PChar;
                          var BufferSize: Integer
                          );
  end; // TMsgClientConnectionManager



////////////////////////////////////////////////////////////////////////////////
//
// TMsgClientListenerThread
//
////////////////////////////////////////////////////////////////////////////////

  TMsgClientListenerThread = class(TThread)
  private
    FManager:       TMsgClientConnectionManager;
    FNetwork:       TMsgNetwork;
    Buffer:         PChar;
    BufferSize:     Integer;
    FromHost:       String;
    FromPort:       Integer;
    Sessions:       TList;
    ClientSession:  PMsgClntSession;
  protected
    procedure Execute; override;
  public
    constructor Create(
                       Manager:       TMsgClientConnectionManager;
                       Buffer:        PChar;
                       BufferSize:    Integer;
                       Network:       TMsgNetwork;
                       FromHost:      String;
                       FromPort:      Integer
                       );
    destructor Destroy; override;
  end;// TMsgClientListenerThread



////////////////////////////////////////////////////////////////////////////////
//
// TMsgClientResendRequestThread
//
////////////////////////////////////////////////////////////////////////////////

  TMsgClientResendRequestThread = class(TThread)
  private
    FManager:           TMsgClientConnectionManager;
    FClientSession:     PMsgClntSession;
    FBuffer:            PChar;
    FNetwork:           TMsgNetwork;
    FHost:              String;
    FPort:              Integer;
  protected
    procedure Execute; override;
  public
    constructor Create(
                       Manager:           TMsgClientConnectionManager;
                       ClientSession:     PMsgClntSession;
                       Buffer:            PChar;
                       Network:           TMsgNetwork;
                       FromHost:          String;
                       FromPort:          Integer
                       );
    destructor Destroy; override;
  end;// TMsgClientResendRequestThread



////////////////////////////////////////////////////////////////////////////////
//
// TMsgClientMsgResendRequestThread
//
////////////////////////////////////////////////////////////////////////////////

  TMsgClientMsgResendRequestThread = class(TThread)
  private
    FManager:           TMsgClientConnectionManager;
    FClientSession:     PMsgClntSession;
    FBuffer:            PChar;
    FNetwork:           TMsgNetwork;
    FHost:              String;
    FPort:              Integer;
  protected
    procedure Execute; override;
  public
    constructor Create(
                       Manager:           TMsgClientConnectionManager;
                       ClientSession:     PMsgClntSession;
                       Buffer:            PChar;
                       Network:           TMsgNetwork;
                       FromHost:          String;
                       FromPort:          Integer
                       );
    destructor Destroy; override;
  end;// TMsgClientMsgResendRequestThread

{$ENDIF} // Client



{$IFDEF SERVER_VERSION} // Server

////////////////////////////////////////////////////////////////////////////////
//
// TMsgServerSessionTerminatorThread
//
////////////////////////////////////////////////////////////////////////////////

  TMsgServerSessionTerminatorThread = class(TThread)
  private
    FManager:                 TMsgServerConnectionManager;
    FTerminatedSessions:      TThreadList;
    Error:                    String;
  protected
    procedure Execute; override;
  public
    constructor Create(
                          Manager:          TMsgServerConnectionManager
                       );
    destructor Destroy; override;
  public
  end;// TMsgServerSessionThread



////////////////////////////////////////////////////////////////////////////////
//
// TMsgServerPingClientsThread
//
////////////////////////////////////////////////////////////////////////////////

  TMsgServerPingClientsThread = class(TThread)
  private
    FManager:                 TMsgServerConnectionManager;
    Error:                    String;
  protected
    procedure Execute; override;
  public
    constructor Create(
                          Manager:          TMsgServerConnectionManager
                       );
    destructor Destroy; override;
  public
  end;// TMsgServerSessionThread



////////////////////////////////////////////////////////////////////////////////
//
// TMsgServerConnectionManager
//
////////////////////////////////////////////////////////////////////////////////


  TMsgServerConnectionManager = class (TMsgBaseConnectionManager)
   private
    FServer:                TComponent;
    ResendRequestThread:    TMsgServerResendRequestThread;
    MsgResendRequestThread: TMsgServerMsgResendRequestThread;
    SessionTerminator:      TMsgServerSessionTerminatorThread;
    PingClientsThread:      TMsgServerPingClientsThread;
   public
    FNetwork:       TMsgNetwork;
//    property Network: TMsgNetwork read FNetwork write FNetwork;
   private
    function SessionsCount: Integer;
    procedure WaitForThread(
                          Thread:        PThread;
                          TimeOut:       DWORD
                            );
    function TerminateServerThread(
                          Thread:        PThread;
                          ErrProcess:    Integer;
                          ErrObject:     String;
                          WaitTimeOut:   DWORD = MsgServerThreadsTerminateDelay
                                      ): Boolean;
    procedure TerminateAllSessionThreads(ServerSession: PMsgSrvrSession);
    procedure TerminateMessageThreads(ServerSession: PMsgSrvrSession);
    procedure TerminateCommandThreads(ServerSession: PMsgSrvrSession);
    procedure EnableNextCommand(ServerSession: PMsgSrvrSession);
    procedure PacketResendRequest(
                               Buffer:      PChar;
                               Network:     TMsgNetwork;
                               RemoteHost:    String;
                               RemotePort:    Integer;
                               PacketID:      Integer = -1;
                               Msg:           Boolean = False
                                 );

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -