📄 udisocketserver.pas
字号:
unit uDISocketServer;
interface
uses
Windows, Sysutils, WinSock2, uWinSocket, uCriticalSection, uIOCompletionPort, uDIProtocol,
uDIBuffer, uDIClientContext, uDIPoolClientContext, uDIMonitor, uDIMapClientContext;
{$I IOCP.inc}
type
TOnSocketEvent = procedure(FClientContext: TDIClientContext) of object;
TOnSocketIOEvent = procedure(FClientContext: TDIClientContext; FDIBuffer: TDIBuffer; dwIoSize: DWORD) of object;
TDISocketServer = Class
protected
m_nPort: Integer; //端口号
m_sListen: TSocket; //Socket监听端口
m_ServerType: TServerStartType; //服务器类型
m_bShutDown: Boolean; //是否停止服务
m_bServerStarted: Boolean; //服务器是否启动
m_bAcceptConnections: Boolean; //是否允许客户端连接
m_iMaxNumConnections: DWORD; //允许最多客户端连接个数
m_iMaxNumberOfFreeContext: DWORD; //空闲上下文池允许的最大数
m_iMaxNumberOfFreeBuffer: DWORD; //空闲Buufer池允许的最大数
m_iNumberOfActiveConnections: Integer; //当前客户端连接个数
m_WinSocket: TWinSocket; //Socket底层函数
m_IOCompletionPort: TIOCompletionPort; //完成端口(外部创建)
m_PoolClientContext: TDIPoolClientContext; //上下文回收池
m_MapClientContext: TDIMapClientContext; //上下文管理
m_MapClientContextLock: TCriticalSection; //上下文管理锁
m_SocketServerLock: TCriticalSection; //锁
published
property FPort: Integer read m_nPort write m_nPort;
property FWinSocket: TWinSocket read m_WinSocket write m_WinSocket;
property FIOCompletionPort: TIOCompletionPort read m_IOCompletionPort write m_IOCompletionPort;
property FPoolClientContext: TDIPoolClientContext read m_PoolClientContext;
property FMapClientContext: TDIMapClientContext read m_MapClientContext;
property FMapClientContextLock: TCriticalSection read m_MapClientContextLock write m_MapClientContextLock;
property FSocketServerLock: TCriticalSection read m_SocketServerLock write m_SocketServerLock;
private
FOnNewSocketEvent: TOnSocketEvent; //客户端连接
FOnCloseSocketEvent: TOnSocketEvent; //客户端关闭
FOnRecvCompletedEvent: TOnSocketIOEvent; //接受客户端消息
FOnSendCompletedEvent: TOnSocketIOEvent; //发送客户端消息
published
property OnNewSocketEvent: TOnSocketEvent read FOnNewSocketEvent write FOnNewSocketEvent;
property OnCloseSocketEvent: TOnSocketEvent read FOnCloseSocketEvent write FOnCloseSocketEvent;
property OnRecvCompletedEvent: TOnSocketIOEvent read FOnRecvCompletedEvent write FOnRecvCompletedEvent;
property OnSendCompletedEvent: TOnSocketIOEvent read FOnSendCompletedEvent write FOnSendCompletedEvent;
published
procedure DisconnectAllClient; virtual; abstract;
procedure KillDeadClientSocket; virtual; abstract;
//新加上下文到Map
function AddClientContext(FClientContext: TDIClientContext): Boolean; virtual; abstract;
//关闭socket,把上下文从Map中移出
procedure DisconnectClient(FClientContext: TDIClientContext); virtual; abstract;
//释放上下文
function ReleaseClientContext(FClientContext: TDIClientContext): Boolean; virtual; abstract;
procedure AppendDisplayMsg(sMsg: String); virtual; abstract;
procedure AppendLogMessage(sMsg: String); virtual; abstract;
procedure AppendErrorLogMessage(sMsg: String); virtual; abstract;
public
function StartServe( nPort: Integer;
iMaxNumConnections: DWORD;
iMaxNumberOfFreeContext: DWORD;
iMaxNumberOfFreeBuffer: DWORD;
StartType: TServerStartType = IOServerStart ): Boolean; virtual; abstract;
procedure StopServer; virtual; abstract;
function Connect(strIPAddr: String; nPort: DWORD): Boolean; virtual; abstract;
procedure ProcessFreeMemory; virtual; abstract;
procedure ProcessIOError(FClientContext: TDIClientContext; FIOEventType: IOEventType; IOErrorType: TIOErrorType); virtual; abstract;
procedure ProcessIOMessage(IOType: IOEventType; FClientContext: TDIClientContext; FBuffer: TDIBuffer; dwIoSize: DWORD); virtual; abstract;
public
constructor Create(IOCompletionPort: TIOCompletionPort);
destructor Destroy; override;
end;
implementation
//TDISocketServer
constructor TDISocketServer.Create(IOCompletionPort: TIOCompletionPort);
begin
inherited Create;
m_WinSocket := TWinSocket.Create;
m_IOCompletionPort := IOCompletionPort;
m_PoolClientContext := TDIPoolClientContext.Create;
m_MapClientContext := TDIMapClientContext.Create;
m_MapClientContextLock := TCriticalSection.Create;
m_SocketServerLock := TCriticalSection.Create;
end;
destructor TDISocketServer.Destroy;
begin
StopServer;
FreeAndNil(m_WinSocket);
FreeAndNil(m_PoolClientContext);
FreeAndNil(m_MapClientContext);
FreeAndNil(m_MapClientContextLock);
FreeAndNil(m_SocketServerLock);
inherited Destroy;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -