source: PinConnection/UCommTCPClient.pas@ 409

Last change on this file since 409 was 407, checked in by chronos, 13 years ago
  • Modified: PinConnection package now use for data parameters TListByte instead of TStream class contained in TemplateGenerics package. TStream have Position property which has no meaning for forwarding plain byte memory block. There is TBinarySerializer class used for serializing data instead of TStreamHelper class.
File size: 3.4 KB
Line 
1unit UCommTCPClient;
2
3{$mode Delphi}{$H+}
4
5interface
6
7uses
8 Classes, SysUtils, blcksock, synsock, UCommPin, UCommon, UThreading,
9 DateUtils, SpecializedList;
10
11type
12 TCommTCPClient = class;
13
14 TReceiveDataEvent = procedure(Stream: TMemoryStream) of object;
15
16 { TCommSocketReceiveThread }
17
18 TCommSocketReceiveThread = class(TListedThread)
19 public
20 Parent: TCommTCPClient;
21 Stream: TListByte;
22 procedure Execute; override;
23 constructor Create(CreateSuspended: Boolean;
24 const StackSize: SizeUInt = DefaultStackSize);
25 destructor Destroy; override;
26 end;
27
28 { TCommTCPClient }
29
30 TCommTCPClient = class
31 private
32 FActive: Boolean;
33 FOnReceiveData: TReceiveDataEvent;
34 FReceiveThread: TCommSocketReceiveThread;
35 procedure ReceiveData(Sender: TCommPin; Stream: TListByte);
36 procedure SetActive(const AValue: Boolean);
37 public
38 Socket: TTCPBlockSocket;
39 Pin: TCommPin;
40 Address: string;
41 Port: Word;
42 property Active: Boolean read FActive write SetActive;
43 constructor Create;
44 destructor Destroy; override;
45 end;
46
47
48implementation
49
50resourcestring
51 SCantConnectToServer = 'Can''t connect to remote server';
52
53{ TCommTCPClient }
54
55procedure TCommTCPClient.ReceiveData(Sender: TCommPin; Stream: TListByte);
56var
57 Mem: TMemoryStream;
58begin
59 if FActive then begin
60 try
61 Mem := TMemoryStream.Create;
62 Stream.WriteToStream(Mem);
63 Socket.SendStreamRaw(Mem);
64 finally
65 Mem.Free;
66 end;
67 end;
68end;
69
70procedure TCommTCPClient.SetActive(const AValue: Boolean);
71begin
72 if FActive = AValue then Exit;
73 FActive := AValue;
74
75 if AValue then begin
76 Socket.Connect(Address, IntToStr(Port));
77 if Socket.LastError <> 0 then begin
78 FActive := False;
79 raise Exception.Create(SCantConnectToServer);
80 end;
81 FReceiveThread := TCommSocketReceiveThread.Create(True);
82
83 FReceiveThread.FreeOnTerminate := False;
84 FReceiveThread.Parent := Self;
85 FReceiveThread.Start;
86 end else begin
87 Socket.CloseSocket;
88 FReceiveThread.Terminate;
89 FReceiveThread.WaitFor;
90 FreeAndNil(FReceiveThread);
91 end;
92end;
93
94constructor TCommTCPClient.Create;
95begin
96 inherited Create;
97 Socket := TTCPBlockSocket.Create;
98 Pin := TCommPin.Create;
99 Pin.OnReceive := ReceiveData;
100end;
101
102destructor TCommTCPClient.Destroy;
103begin
104 Active := False;
105 Socket.Free;
106 Pin.Free;
107 inherited Destroy;
108end;
109
110{ TCommSocketReceiveThread }
111
112procedure TCommSocketReceiveThread.Execute;
113var
114 InBufferUsed: Integer;
115 Buffer: array of Byte;
116begin
117 InBufferUsed := 0;
118 with Parent do begin
119 repeat
120 if InBufferUsed = 0 then Sleep(1);
121 //else Yield;
122 if Assigned(Socket) then
123 with Socket do
124 if CanRead(0) then begin
125 InBufferUsed := WaitingData;
126 if InBufferUsed > 0 then begin
127 SetLength(Buffer, InBufferUsed);
128 RecvBuffer(Buffer, Length(Buffer));
129
130 Stream.Count := Length(Buffer);
131 Stream.ReplaceBuffer(0, Pointer(Buffer)^, Length(Buffer));
132 Pin.Send(Stream);
133 end else InBufferUsed := 0;
134 end else InBufferUsed := 0;
135 until Terminated;
136 end;
137end;
138
139constructor TCommSocketReceiveThread.Create(CreateSuspended: Boolean;
140 const StackSize: SizeUInt);
141begin
142 inherited;
143 Stream := TListByte.Create;
144end;
145
146destructor TCommSocketReceiveThread.Destroy;
147begin
148 Stream.Free;
149 inherited;
150end;
151
152end.
153
Note: See TracBrowser for help on using the repository browser.