| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- unit uRemoteServerDIOCPImpl;
- interface
- uses
- uIRemoteServer,
- uRawTcpClientCoderImpl,
- uStreamCoderSocket,
- uZipTools,
- qmsgpack,
- Classes,
- SysUtils,
- RawTcpClient, uICoderSocket;
- type
- TRemoteServerDIOCPImpl = class(TInterfacedObject, IRemoteServer, IRemoteServerConnector)
- private
- FTcpClient: TRawTcpClient;
- FCoderSocket: ICoderSocket;
- FMsgPack:TQMsgPack;
- FSendStream:TMemoryStream;
- FRecvStream:TMemoryStream;
- protected
- /// <summary>
- /// Ö´ÐÐÔ¶³Ì¶¯×÷
- /// </summary>
- function Execute(pvCmdIndex: Integer; var vData: OleVariant): Boolean; stdcall;
- public
- procedure AfterConstruction; override;
- procedure setHost(pvHost: PAnsiChar);
- procedure setPort(pvPort:Integer);
- procedure open;
- destructor Destroy; override;
- end;
- implementation
- procedure TRemoteServerDIOCPImpl.AfterConstruction;
- begin
- inherited AfterConstruction;
- FTcpClient := TRawTcpClient.Create(nil);
- FCoderSocket := TRawTcpClientCoderImpl.Create(FTcpClient);
-
- FMsgPack := TQMsgPack.Create;
- FRecvStream := TMemoryStream.Create;
- FSendStream := TMemoryStream.Create;
- end;
- destructor TRemoteServerDIOCPImpl.Destroy;
- begin
- FCoderSocket := nil;
- FTcpClient.Disconnect;
- FTcpClient.Free;
- FMsgPack.Free;
- FRecvStream.Free;
- FSendStream.Free;
- inherited Destroy;
- end;
- { TRemoteServerDIOCPImpl }
- function TRemoteServerDIOCPImpl.Execute(pvCmdIndex: Integer; var vData:
- OleVariant): Boolean;
- begin
- if not FTcpClient.Active then FTcpClient.Connect;
- FSendStream.Clear;
- FRecvStream.Clear;
- FMsgPack.Clear;
- FMsgPack.ForcePath('cmd.index').AsInteger := pvCmdIndex;
- FMsgPack.ForcePath('cmd.data').AsVariant := vData;
- FMsgPack.SaveToStream(FSendStream);
- TZipTools.compressStreamEX(FSendStream);
- TStreamCoderSocket.SendObject(FCoderSocket, FSendStream);
- TStreamCoderSocket.RecvObject(FCoderSocket, FRecvStream);
- TZipTools.unCompressStreamEX(FRecvStream);
- FRecvStream.Position := 0;
-
- FMsgPack.LoadFromStream(FRecvStream);
- Result := FMsgPack.ForcePath('__result.result').AsBoolean;
- if not Result then
- if FMsgPack.ForcePath('__result.msg').AsString <> '' then
- begin
- raise Exception.Create(FMsgPack.ForcePath('__result.msg').AsString);
- end;
- vData := FMsgPack.ForcePath('__result.data').AsVariant;
- end;
- procedure TRemoteServerDIOCPImpl.open;
- begin
- FTcpClient.Disconnect;
- FTcpClient.Connect;
- end;
- procedure TRemoteServerDIOCPImpl.setHost(pvHost: PAnsiChar);
- begin
- FTcpClient.Host := AnsiString(pvHost);
- end;
- procedure TRemoteServerDIOCPImpl.setPort(pvPort: Integer);
- begin
- FTcpClient.Port := pvPort;
- end;
- end.
|