uRemoteServerDIOCPImpl.pas 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. unit uRemoteServerDIOCPImpl;
  2. interface
  3. uses
  4. uIRemoteServer,
  5. uRawTcpClientCoderImpl,
  6. uStreamCoderSocket,
  7. uZipTools,
  8. qmsgpack,
  9. Classes,
  10. SysUtils,
  11. RawTcpClient, uICoderSocket;
  12. type
  13. TRemoteServerDIOCPImpl = class(TInterfacedObject, IRemoteServer, IRemoteServerConnector)
  14. private
  15. FTcpClient: TRawTcpClient;
  16. FCoderSocket: ICoderSocket;
  17. FMsgPack:TQMsgPack;
  18. FSendStream:TMemoryStream;
  19. FRecvStream:TMemoryStream;
  20. protected
  21. /// <summary>
  22. /// Ö´ÐÐÔ¶³Ì¶¯×÷
  23. /// </summary>
  24. function Execute(pvCmdIndex: Integer; var vData: OleVariant): Boolean; stdcall;
  25. public
  26. procedure AfterConstruction; override;
  27. procedure setHost(pvHost: PAnsiChar);
  28. procedure setPort(pvPort:Integer);
  29. procedure open;
  30. destructor Destroy; override;
  31. end;
  32. implementation
  33. procedure TRemoteServerDIOCPImpl.AfterConstruction;
  34. begin
  35. inherited AfterConstruction;
  36. FTcpClient := TRawTcpClient.Create(nil);
  37. FCoderSocket := TRawTcpClientCoderImpl.Create(FTcpClient);
  38. FMsgPack := TQMsgPack.Create;
  39. FRecvStream := TMemoryStream.Create;
  40. FSendStream := TMemoryStream.Create;
  41. end;
  42. destructor TRemoteServerDIOCPImpl.Destroy;
  43. begin
  44. FCoderSocket := nil;
  45. FTcpClient.Disconnect;
  46. FTcpClient.Free;
  47. FMsgPack.Free;
  48. FRecvStream.Free;
  49. FSendStream.Free;
  50. inherited Destroy;
  51. end;
  52. { TRemoteServerDIOCPImpl }
  53. function TRemoteServerDIOCPImpl.Execute(pvCmdIndex: Integer; var vData:
  54. OleVariant): Boolean;
  55. begin
  56. if not FTcpClient.Active then FTcpClient.Connect;
  57. FSendStream.Clear;
  58. FRecvStream.Clear;
  59. FMsgPack.Clear;
  60. FMsgPack.ForcePath('cmd.index').AsInteger := pvCmdIndex;
  61. FMsgPack.ForcePath('cmd.data').AsVariant := vData;
  62. FMsgPack.SaveToStream(FSendStream);
  63. TZipTools.compressStreamEX(FSendStream);
  64. TStreamCoderSocket.SendObject(FCoderSocket, FSendStream);
  65. TStreamCoderSocket.RecvObject(FCoderSocket, FRecvStream);
  66. TZipTools.unCompressStreamEX(FRecvStream);
  67. FRecvStream.Position := 0;
  68. FMsgPack.LoadFromStream(FRecvStream);
  69. Result := FMsgPack.ForcePath('__result.result').AsBoolean;
  70. if not Result then
  71. if FMsgPack.ForcePath('__result.msg').AsString <> '' then
  72. begin
  73. raise Exception.Create(FMsgPack.ForcePath('__result.msg').AsString);
  74. end;
  75. vData := FMsgPack.ForcePath('__result.data').AsVariant;
  76. end;
  77. procedure TRemoteServerDIOCPImpl.open;
  78. begin
  79. FTcpClient.Disconnect;
  80. FTcpClient.Connect;
  81. end;
  82. procedure TRemoteServerDIOCPImpl.setHost(pvHost: PAnsiChar);
  83. begin
  84. FTcpClient.Host := AnsiString(pvHost);
  85. end;
  86. procedure TRemoteServerDIOCPImpl.setPort(pvPort: Integer);
  87. begin
  88. FTcpClient.Port := pvPort;
  89. end;
  90. end.