Commit bbaeccbd4a93c25971050dd25099c516232a8dd9
1 parent
fef87696
Exists in
master
finally fully working network
- fully implemented chat (PUSH>POLL>PULL>PUB>SUB) - fully implemented request and replies (PUSH_REQ>POLL>PULL>REP)
Showing
8 changed files
with
193 additions
and
141 deletions
Show diff stats
cultural_matrix.lpi
... | ... | @@ -38,7 +38,7 @@ |
38 | 38 | <PackageName Value="LCL"/> |
39 | 39 | </Item3> |
40 | 40 | </RequiredPackages> |
41 | - <Units Count="19"> | |
41 | + <Units Count="17"> | |
42 | 42 | <Unit0> |
43 | 43 | <Filename Value="cultural_matrix.lpr"/> |
44 | 44 | <IsPartOfProject Value="True"/> |
... | ... | @@ -113,17 +113,9 @@ |
113 | 113 | <IsPartOfProject Value="True"/> |
114 | 114 | </Unit15> |
115 | 115 | <Unit16> |
116 | - <Filename Value="units/zmq_network.pas"/> | |
117 | - <IsPartOfProject Value="True"/> | |
118 | - </Unit16> | |
119 | - <Unit17> | |
120 | 116 | <Filename Value="units/zmq_network3.pas"/> |
121 | 117 | <IsPartOfProject Value="True"/> |
122 | - </Unit17> | |
123 | - <Unit18> | |
124 | - <Filename Value="units/game_zmq_actors.pas"/> | |
125 | - <IsPartOfProject Value="True"/> | |
126 | - </Unit18> | |
118 | + </Unit16> | |
127 | 119 | </Units> |
128 | 120 | </ProjectOptions> |
129 | 121 | <CompilerOptions> | ... | ... |
cultural_matrix.lpr
... | ... | @@ -40,7 +40,7 @@ begin |
40 | 40 | if FileExists(F) then |
41 | 41 | try |
42 | 42 | ID.LoadFromFile(F); |
43 | - F := ID.Text; | |
43 | + F := Copy(ID.Text,0,Length(ID.Text)-2); | |
44 | 44 | finally |
45 | 45 | ID.Free; |
46 | 46 | end |
... | ... | @@ -48,7 +48,7 @@ begin |
48 | 48 | try |
49 | 49 | ID.Text := s_random(32); |
50 | 50 | ID.SaveToFile(F); |
51 | - F := ID.Text; | |
51 | + F := Copy(ID.Text,0,Length(ID.Text)-2); | |
52 | 52 | except |
53 | 53 | on E: Exception do |
54 | 54 | begin | ... | ... |
form_chooseactor.lfm
form_chooseactor.pas
form_matrixgame.pas
... | ... | @@ -212,21 +212,20 @@ procedure TFormMatrixGame.SetGameActor(AValue: TGameActor); |
212 | 212 | |
213 | 213 | procedure SetZMQAdmin; |
214 | 214 | begin |
215 | - | |
216 | - FGameControl := TGameControl.Create(TZMQAdmin.Create(Self),FID); | |
215 | + FGameControl := TGameControl.Create(TZMQAdmin.Create(Self,FID)); | |
217 | 216 | GBAdmin.Visible:= True; |
218 | 217 | end; |
219 | 218 | |
220 | 219 | procedure SetZMQPlayer; |
221 | 220 | begin |
222 | - FGameControl := TGameControl.Create(TZMQPlayer.Create(Self),FID); | |
221 | + FGameControl := TGameControl.Create(TZMQPlayer.Create(Self,FID)); | |
223 | 222 | btnConfirmRow.Visible := True; |
224 | 223 | StringGridMatrix.Enabled := True; |
225 | 224 | end; |
226 | 225 | |
227 | 226 | procedure SetZMQWatcher; |
228 | 227 | begin |
229 | - FGameControl := TGameControl.Create(TZMQWatcher.Create(Self),FID); | |
228 | + //FGameControl := TGameControl.Create(TZMQWatcher.Create(Self,FID)); | |
230 | 229 | end; |
231 | 230 | |
232 | 231 | begin | ... | ... |
units/game_control.pas
... | ... | @@ -43,7 +43,7 @@ type |
43 | 43 | procedure SetRowBase(AValue: integer); |
44 | 44 | procedure SendSystemMessage(AMessage: array of UTF8String); |
45 | 45 | public |
46 | - constructor Create(AZMQActor : TZMQActor;AID : string);overload; | |
46 | + constructor Create(AOwner : TComponent);override; | |
47 | 47 | destructor Destroy; override; |
48 | 48 | procedure SetMatrix; |
49 | 49 | procedure SendRequest(ARequest : UTF8string); |
... | ... | @@ -129,6 +129,8 @@ end; |
129 | 129 | |
130 | 130 | function TGameControl.MessageHas(const A_CONST: string; AMessage: TStringList): Boolean; |
131 | 131 | begin |
132 | + Result:= False; | |
133 | + if not Assigned(AMessage) then Exit; | |
132 | 134 | Result := Pos(A_CONST,AMessage[0])>0; |
133 | 135 | end; |
134 | 136 | |
... | ... | @@ -210,13 +212,14 @@ end; |
210 | 212 | |
211 | 213 | procedure TGameControl.SendSystemMessage(AMessage: array of UTF8String); |
212 | 214 | begin |
213 | - TZMQAdmin(FZMQActor).SendMessage(AMessage); | |
215 | + //TZMQAdmin(FZMQActor).SendMessage(AMessage); | |
214 | 216 | end; |
215 | 217 | |
216 | -constructor TGameControl.Create(AZMQActor: TZMQActor; AID: string); | |
218 | +constructor TGameControl.Create(AOwner: TComponent); | |
217 | 219 | begin |
218 | - inherited Create(AZMQActor.Owner); | |
219 | - FZMQActor := AZMQActor; | |
220 | + FZMQActor := TZMQActor(AOwner); | |
221 | + inherited Create(FZMQActor.Owner); | |
222 | + FID := FZMQActor.ID; | |
220 | 223 | FZMQActor.OnMessageReceived:=@ReceiveMessage; |
221 | 224 | FZMQActor.OnRequestReceived:=@ReceiveRequest; |
222 | 225 | FZMQActor.OnReplyReceived:=@ReceiveReply; |
... | ... | @@ -233,10 +236,7 @@ begin |
233 | 236 | MustDrawDots:=False; |
234 | 237 | MustDrawDotsClear:=False; |
235 | 238 | |
236 | - FZMQActor.SetID(AID); | |
237 | - FID := AID; | |
238 | - | |
239 | - FExperiment := TExperiment.Create(AZMQActor.Owner); | |
239 | + FExperiment := TExperiment.Create(FZMQActor.Owner); | |
240 | 240 | SendRequest(K_LOGIN); |
241 | 241 | end; |
242 | 242 | |
... | ... | @@ -251,33 +251,55 @@ begin |
251 | 251 | end; |
252 | 252 | |
253 | 253 | procedure TGameControl.SendRequest(ARequest: UTF8string); |
254 | +var | |
255 | + M : array of UTF8String; | |
256 | + | |
257 | + procedure SetM(A : array of UTF8String); | |
258 | + var i : integer; | |
259 | + begin | |
260 | + SetLength(M,Length(A)); | |
261 | + for i := 0 to Length(A) -1 do | |
262 | + M[i] := A[i]; | |
263 | + end; | |
254 | 264 | begin |
265 | + case ARequest of | |
266 | + K_LOGIN : SetM([ | |
267 | + FZMQActor.ID | |
268 | + , ' ' | |
269 | + , ARequest | |
270 | + ]); | |
271 | + end; | |
255 | 272 | |
273 | + case FActor of | |
274 | + gaAdmin: begin | |
275 | + M[2] := GA_ADMIN+M[2]; | |
276 | + end; | |
277 | + gaPlayer:begin | |
278 | + M[2] := GA_PLAYER+M[2]; | |
279 | + end; | |
280 | + //gaWatcher:begin // for now cannot SendMessages | |
281 | + // M[0] := GA_WATCHER+M[0]; | |
282 | + end; | |
283 | + FZMQActor.Request(M); | |
256 | 284 | end; |
257 | 285 | |
258 | 286 | |
259 | 287 | procedure TGameControl.SendMessage(AMessage: UTF8string); |
260 | 288 | var |
261 | -{$IFDEF DEBUG} | |
262 | - i : integer; | |
263 | -{$ENDIF} | |
264 | - M : array of UTF8string; | |
289 | + M : array of UTF8String; | |
265 | 290 | |
266 | - procedure SetM(A: array of UTF8String); | |
291 | + procedure SetM(A : array of UTF8String); | |
267 | 292 | var i : integer; |
268 | 293 | begin |
269 | 294 | SetLength(M,Length(A)); |
270 | 295 | for i := 0 to Length(A) -1 do |
271 | 296 | M[i] := A[i]; |
272 | 297 | end; |
273 | - | |
274 | 298 | begin |
275 | 299 | case AMessage of |
276 | 300 | K_ARRIVED : SetM([ |
277 | 301 | AMessage |
278 | 302 | , FZMQActor.ID |
279 | - //, FZMQActor.ClassType.ClassName; | |
280 | - //, | |
281 | 303 | ]); |
282 | 304 | |
283 | 305 | K_CHOICE : SetM([ |
... | ... | @@ -318,15 +340,13 @@ begin |
318 | 340 | // M[0] := GA_WATCHER+M[0]; |
319 | 341 | end; |
320 | 342 | FZMQActor.SendMessage(M); |
321 | - | |
322 | -{$IFDEF DEBUG} | |
323 | - for i := 0 to Length(M)-1 do | |
324 | - WriteLn(M[i]); | |
325 | -{$ENDIF} | |
326 | 343 | end; |
327 | 344 | |
328 | 345 | procedure TGameControl.ReceiveMessage(AMessage: TStringList); |
329 | - | |
346 | +{$IFDEF DEBUG} | |
347 | +var | |
348 | + i : integer; | |
349 | +{$ENDIF} | |
330 | 350 | function MHas(const C : string) : Boolean; |
331 | 351 | begin |
332 | 352 | Result := MessageHas(C,AMessage); |
... | ... | @@ -508,17 +528,51 @@ begin |
508 | 528 | if MHas(K_LEFT) then SayGoodBye; |
509 | 529 | if MHas(K_RESUME) then ResumeActor; |
510 | 530 | if MHas(K_STATUS) then ReceiveStatus; |
531 | + | |
532 | + {$IFDEF DEBUG} | |
533 | + AMessage.Append('MessageReceived'); | |
534 | + for i:= 0 to AMessage.Count-1 do | |
535 | + WriteLn(AMessage[i]); | |
536 | + {$ENDIF} | |
511 | 537 | end; |
512 | 538 | |
513 | 539 | procedure TGameControl.ReceiveRequest(var ARequest: TStringList); |
540 | +{$IFDEF DEBUG} | |
541 | +var | |
542 | + i : integer; | |
543 | +{$ENDIF} | |
544 | + function MHas(const C : string) : Boolean; | |
545 | + begin | |
546 | + Result := MessageHas(C,ARequest); | |
547 | + end; | |
548 | + | |
549 | + procedure ReplyLogin; | |
550 | + begin | |
551 | + | |
552 | + end; | |
514 | 553 | begin |
554 | + if MHas(K_LOGIN) then ReplyLogin; | |
515 | 555 | |
556 | + {$IFDEF DEBUG} | |
557 | + ARequest.Append('RequestReceived'); | |
558 | + for i:= 0 to ARequest.Count-1 do | |
559 | + WriteLn(ARequest[i]); | |
560 | + {$ENDIF} | |
516 | 561 | end; |
517 | 562 | |
563 | + | |
564 | +// player | |
518 | 565 | procedure TGameControl.ReceiveReply(AReply: TStringList); |
566 | +var i: integer; | |
519 | 567 | begin |
520 | - | |
568 | + {$IFDEF DEBUG} | |
569 | + AReply.Append('ReplyReceived'); | |
570 | + for i:= 0 to AReply.Count-1 do | |
571 | + WriteLn(AReply[i]); | |
572 | + {$ENDIF} | |
521 | 573 | end; |
522 | 574 | |
575 | + | |
576 | + | |
523 | 577 | end. |
524 | 578 | ... | ... |
units/game_zmq_actors.pas
... | ... | @@ -16,18 +16,17 @@ type |
16 | 16 | |
17 | 17 | TZMQActor = class(TComponent) |
18 | 18 | private |
19 | - FID: UTF8string; | |
20 | 19 | FOnMessageReceived : TMessRecvProc; |
21 | 20 | FOnReplyReceived: TMessRecvProc; |
22 | 21 | FOnRequestReceived: TReqRecvProc; |
23 | 22 | protected |
23 | + FID: UTF8string; | |
24 | 24 | procedure MessageReceived(AMultipartMessage : TStringList); |
25 | - procedure ReplyReceived(AMultipartMessage : TStringList); virtual; | |
26 | - procedure RequestReceived(var AMultipartMessage : TStringList); virtual; | |
25 | + procedure ReplyReceived(AMultipartMessage : TStringList); | |
26 | + procedure RequestReceived(var AMultipartMessage : TStringList); | |
27 | 27 | public |
28 | - constructor Create(AOwner : TComponent); override; | |
28 | + constructor Create(AOwner : TComponent; AID : UTF8String); virtual; overload; | |
29 | 29 | procedure Start; virtual; |
30 | - procedure SetID(S:string); virtual; | |
31 | 30 | procedure SendMessage(AMessage : array of UTF8string);virtual;abstract; |
32 | 31 | procedure Request(ARequest : array of UTF8string);virtual;abstract; |
33 | 32 | property OnMessageReceived : TMessRecvProc read FOnMessageReceived write FOnMessageReceived; |
... | ... | @@ -41,10 +40,8 @@ type |
41 | 40 | TZMQPlayer = class(TZMQActor) |
42 | 41 | private |
43 | 42 | FZMQClient : TZMQClientThread; |
44 | - protected | |
45 | - procedure ReplyReceived(AMultipartMessage: TStringList); override; | |
46 | 43 | public |
47 | - constructor Create(AOwner : TComponent); override; | |
44 | + constructor Create(AOwner : TComponent; AID : UTF8String); override; | |
48 | 45 | destructor Destroy; override; |
49 | 46 | procedure Start; override; |
50 | 47 | procedure SendMessage(AMessage : array of UTF8string); override; |
... | ... | @@ -56,10 +53,8 @@ type |
56 | 53 | TZMQAdmin = class(TZMQActor) |
57 | 54 | private |
58 | 55 | FZMQServer : TZMQServerThread; |
59 | - protected | |
60 | - procedure RequestReceived(var AMultipartMessage: TStringList); override; | |
61 | 56 | public |
62 | - constructor Create(AOwner : TComponent); override; | |
57 | + constructor Create(AOwner : TComponent; AID : UTF8String); override; | |
63 | 58 | destructor Destroy; override; |
64 | 59 | procedure Start; override; |
65 | 60 | procedure SendMessage(AMessage: array of UTF8string); override; |
... | ... | @@ -85,12 +80,14 @@ end; |
85 | 80 | |
86 | 81 | { TZMQAdmin } |
87 | 82 | |
88 | -constructor TZMQAdmin.Create(AOwner: TComponent); | |
83 | +constructor TZMQAdmin.Create(AOwner: TComponent; AID: UTF8String); | |
89 | 84 | begin |
90 | 85 | inherited Create(AOwner); |
91 | - FZMQServer := TZMQServerThread.Create; | |
86 | + FID:=AID; | |
87 | + FZMQServer := TZMQServerThread.Create(AID); | |
92 | 88 | FZMQServer.OnMessageReceived:=@MessageReceived; |
93 | 89 | FZMQServer.OnRequestReceived:=@RequestReceived; |
90 | + | |
94 | 91 | end; |
95 | 92 | |
96 | 93 | destructor TZMQAdmin.Destroy; |
... | ... | @@ -109,13 +106,9 @@ begin |
109 | 106 | // do nothing, you are the server |
110 | 107 | end; |
111 | 108 | |
112 | -procedure TZMQAdmin.RequestReceived(var AMultipartMessage: TStringList); | |
113 | -begin | |
114 | - if Assigned(FOnRequestReceived) then FOnRequestReceived(AMultipartMessage); | |
115 | -end; | |
116 | - | |
117 | 109 | procedure TZMQAdmin.Start; |
118 | 110 | begin |
111 | + inherited Start; | |
119 | 112 | FZMQServer.Start; |
120 | 113 | WriteLn('TZMQAdmin.Start'); |
121 | 114 | end; |
... | ... | @@ -132,15 +125,11 @@ begin |
132 | 125 | FZMQClient.Request(ARequest); |
133 | 126 | end; |
134 | 127 | |
135 | -procedure TZMQPlayer.ReplyReceived(AMultipartMessage: TStringList); | |
136 | -begin | |
137 | - if Assigned(FOnReplyReceived) then FOnReplyReceived(AMultipartMessage); | |
138 | -end; | |
139 | - | |
140 | -constructor TZMQPlayer.Create(AOwner: TComponent); | |
128 | +constructor TZMQPlayer.Create(AOwner: TComponent; AID: UTF8String); | |
141 | 129 | begin |
142 | 130 | inherited Create(AOwner); |
143 | - FZMQClient := TZMQClientThread.Create; | |
131 | + FID:=AID; | |
132 | + FZMQClient := TZMQClientThread.Create(AID); | |
144 | 133 | FZMQClient.OnMessageReceived:=@MessageReceived; |
145 | 134 | FZMQClient.OnReplyReceived:=@ReplyReceived; |
146 | 135 | end; |
... | ... | @@ -160,11 +149,6 @@ end; |
160 | 149 | |
161 | 150 | { TZMQActor } |
162 | 151 | |
163 | -procedure TZMQActor.SetID(S: string); | |
164 | -begin | |
165 | - FID := S; | |
166 | -end; | |
167 | - | |
168 | 152 | procedure TZMQActor.MessageReceived(AMultipartMessage: TStringList); |
169 | 153 | begin |
170 | 154 | if Assigned(FOnMessageReceived) then FOnMessageReceived(AMultipartMessage); |
... | ... | @@ -172,15 +156,15 @@ end; |
172 | 156 | |
173 | 157 | procedure TZMQActor.ReplyReceived(AMultipartMessage: TStringList); |
174 | 158 | begin |
175 | - AbstractError; | |
159 | + if Assigned(FOnReplyReceived) then FOnReplyReceived(AMultipartMessage); | |
176 | 160 | end; |
177 | 161 | |
178 | 162 | procedure TZMQActor.RequestReceived(var AMultipartMessage: TStringList); |
179 | 163 | begin |
180 | - AbstractError; | |
164 | + if Assigned(FOnRequestReceived) then FOnRequestReceived(AMultipartMessage); | |
181 | 165 | end; |
182 | 166 | |
183 | -constructor TZMQActor.Create(AOwner: TComponent); | |
167 | +constructor TZMQActor.Create(AOwner: TComponent; AID: UTF8String); | |
184 | 168 | begin |
185 | 169 | inherited Create(AOwner); |
186 | 170 | end; | ... | ... |
units/zmq_network.pas
... | ... | @@ -31,8 +31,10 @@ type |
31 | 31 | TZMQClientThread = class(TThread) |
32 | 32 | private |
33 | 33 | FContext : TZMQContext; |
34 | + FID: shortstring; | |
34 | 35 | FSubscriber, |
35 | - FPusher, | |
36 | + FPusher_PUB, | |
37 | + FPusher_REQ, | |
36 | 38 | FRequester : TZMQSocket; |
37 | 39 | FPoller : TZMQPoller; |
38 | 40 | FMessage : TStringList; |
... | ... | @@ -42,25 +44,28 @@ type |
42 | 44 | protected |
43 | 45 | procedure Execute; override; |
44 | 46 | public |
45 | - constructor Create(CreateSuspended: Boolean = True); | |
47 | + constructor Create(AID : UTF8String; CreateSuspended: Boolean = True); overload; | |
46 | 48 | destructor Destroy; override; |
47 | 49 | procedure Request(AMultipartMessage : array of UTF8String); |
48 | 50 | procedure Push(AMultipartMessage : array of UTF8String); |
49 | 51 | property OnMessageReceived : TMessRecvProc read FOnMessageReceived write FOnMessageReceived; |
50 | 52 | property OnReplyReceived : TMessRecvProc read FOnReplyReceived write FOnReplyReceived; |
53 | + property ID :shortstring read FID; | |
51 | 54 | end; |
52 | 55 | |
53 | 56 | { TZMQServerThread } |
54 | 57 | |
55 | 58 | TZMQServerThread = class(TThread) |
56 | 59 | private |
60 | + FID: shortstring; | |
57 | 61 | FOnMessageReceived: TMessRecvProc; |
58 | 62 | FOnRequestReceived: TReqRecvProc; |
59 | 63 | FContext : TZMQContext; |
60 | 64 | FPublisher, |
61 | - FPuller, | |
62 | - FPusher, | |
63 | - FRouter, | |
65 | + FPuller_PUB, | |
66 | + FPusher_PUB, | |
67 | + FPuller_REP, | |
68 | + //FRouter, | |
64 | 69 | FReplier : TZMQSocket; |
65 | 70 | FPoller : TZMQPoller; |
66 | 71 | FMessage : TStringList; |
... | ... | @@ -70,11 +75,12 @@ type |
70 | 75 | protected |
71 | 76 | procedure Execute; override; |
72 | 77 | public |
73 | - constructor Create(CreateSuspended: Boolean = True); | |
78 | + constructor Create(AID : UTF8String; CreateSuspended: Boolean = True); overload; | |
74 | 79 | destructor Destroy; override; |
75 | 80 | procedure Push(AMultipartMessage: array of UTF8string); |
76 | 81 | property OnMessageReceived : TMessRecvProc read FOnMessageReceived write FOnMessageReceived; |
77 | 82 | property OnRequestReceived : TReqRecvProc read FOnRequestReceived write FOnRequestReceived; |
83 | + property ID :shortstring read FID; | |
78 | 84 | end; |
79 | 85 | |
80 | 86 | implementation |
... | ... | @@ -83,8 +89,10 @@ const |
83 | 89 | CHost = 'tcp://*:'; |
84 | 90 | CLocalHost = 'tcp://localhost:'; |
85 | 91 | CPortPublisher = '5056'; |
86 | - CPortPuller = '5057'; | |
87 | - CPortRouter = '5058'; | |
92 | + CPortPuller_PUB = '5057'; | |
93 | + CPortPuller_REP = '6057'; | |
94 | + //CPortRouter = '5058'; | |
95 | + CPortReplier = '5059'; | |
88 | 96 | |
89 | 97 | |
90 | 98 | { TZMQClientThread } |
... | ... | @@ -108,20 +116,22 @@ begin |
108 | 116 | LPollEvent := FPoller.poll(50000); |
109 | 117 | if LPollEvent > 0 then |
110 | 118 | begin |
111 | - WriteLn('Server4:FPoller:',FPoller.PollNumber); | |
112 | 119 | LMessagesCount := FSubscriber.recv(LMultipartMessage); |
113 | 120 | if LMessagesCount > 0 then |
114 | 121 | begin |
115 | 122 | FMessage := LMultipartMessage; |
116 | 123 | Synchronize(@MessageReceived); |
117 | 124 | end; |
125 | + {$IFDEF DEBUG} | |
126 | + WriteLn('Server4:FPoller:',FPoller.PollNumber); | |
127 | + {$ENDIF} | |
118 | 128 | end; |
119 | 129 | end; |
120 | 130 | LMultipartMessage.Free; |
121 | 131 | end; |
122 | 132 | |
123 | 133 | |
124 | -constructor TZMQClientThread.Create(CreateSuspended: Boolean); | |
134 | +constructor TZMQClientThread.Create(AID: UTF8String; CreateSuspended: Boolean); | |
125 | 135 | begin |
126 | 136 | FreeOnTerminate := True; |
127 | 137 | FContext := TZMQContext.create; |
... | ... | @@ -130,12 +140,17 @@ begin |
130 | 140 | FSubscriber := FContext.Socket( stSub ); |
131 | 141 | FSubscriber.connect(CLocalHost+CPortPublisher);FSubscriber.Subscribe(''); |
132 | 142 | // pushes to server |
133 | - FPusher := FContext.Socket( stPush ); | |
134 | - FPusher.connect(CLocalHost+CPortPuller); | |
143 | + FPusher_PUB := FContext.Socket( stPush ); | |
144 | + FPusher_PUB.connect(CLocalHost+CPortPuller_PUB); | |
145 | + | |
146 | + FPusher_REQ := FContext.Socket( stPush ); | |
147 | + FPusher_REQ.connect(CLocalHost+CPortPuller_REP); | |
135 | 148 | |
136 | 149 | // request from server |
137 | 150 | FRequester := FContext.Socket( stReq ); |
138 | - FRequester.connect(CLocalHost+CPortRouter); | |
151 | + //FRequester.Identity := AID; | |
152 | + //FRequester.connect(CLocalHost+CPortRouter); | |
153 | + FRequester.connect(CLocalHost+CPortReplier); | |
139 | 154 | |
140 | 155 | // handle income messages |
141 | 156 | FPoller := TZMQPoller.Create(True, FContext); |
... | ... | @@ -148,7 +163,8 @@ destructor TZMQClientThread.Destroy; |
148 | 163 | begin |
149 | 164 | FPoller.Terminate; |
150 | 165 | FPoller.Free; |
151 | - FPusher.Free; | |
166 | + FPusher_REQ.Free; | |
167 | + FPusher_PUB.Free; | |
152 | 168 | FSubscriber.Free; |
153 | 169 | FContext.Free; |
154 | 170 | inherited Destroy; |
... | ... | @@ -158,15 +174,18 @@ procedure TZMQClientThread.Request(AMultipartMessage: array of UTF8String); |
158 | 174 | var AReply : TStringList; |
159 | 175 | begin |
160 | 176 | AReply:=TStringList.Create; |
161 | - FRequester.send( AMultipartMessage ); | |
162 | - FRequester.recv( AReply ); | |
177 | + | |
178 | + FPusher_REQ.send( AMultipartMessage ); // avoid infinite loops inside server pool | |
179 | + FRequester.send( '' ); // block client until server recv | |
180 | + FRequester.recv( AReply ); // release client | |
181 | + | |
163 | 182 | if Assigned(FOnReplyReceived) then FOnReplyReceived(AReply); |
164 | 183 | AReply.Free; |
165 | 184 | end; |
166 | 185 | |
167 | 186 | procedure TZMQClientThread.Push(AMultipartMessage: array of UTF8String); |
168 | 187 | begin |
169 | - FPusher.send(AMultipartMessage); | |
188 | + FPusher_PUB.send(AMultipartMessage); | |
170 | 189 | end; |
171 | 190 | |
172 | 191 | |
... | ... | @@ -189,12 +208,12 @@ end; |
189 | 208 | |
190 | 209 | procedure TZMQServerThread.RequestReceived; |
191 | 210 | begin |
192 | - if Assigned(FOnMessageReceived) then FOnMessageReceived(FMessage); | |
211 | + if Assigned(FOnRequestReceived) then FOnRequestReceived(FMessage); | |
193 | 212 | end; |
194 | 213 | |
195 | 214 | procedure TZMQServerThread.Execute; |
196 | 215 | var |
197 | - LMultipartMessage : TStringList; | |
216 | + LMultipartMessage, S : TStringList; | |
198 | 217 | LPollCount, |
199 | 218 | LMessagesCount : integer; |
200 | 219 | begin |
... | ... | @@ -204,71 +223,74 @@ begin |
204 | 223 | LMultipartMessage := TStringList.Create; |
205 | 224 | while not Terminated do |
206 | 225 | begin |
207 | - LMultipartMessage.Clear; | |
208 | - LPollCount := FPoller.poll(50000); | |
209 | - if LPollCount > 0 then | |
226 | + LPollCount := FPoller.poll; | |
227 | + if LPollCount = 0 then Continue; | |
228 | + if pePollIn in FPoller.PollItem[0].revents then | |
210 | 229 | begin |
211 | - case FPoller.PollNumber of | |
212 | - 2 : begin// puller | |
213 | - {$IFDEF DEBUG} | |
214 | - WriteLn('Server2:'); | |
215 | - {$ENDIF} | |
216 | - LMessagesCount := FPuller.recv(LMultipartMessage); | |
217 | - if LMessagesCount > 0 then | |
218 | - begin | |
219 | - FMessage := LMultipartMessage; | |
220 | - Synchronize(@MessageReceived); | |
221 | - FPublisher.send(LMultiPartMessage); | |
222 | - end; | |
223 | - end; | |
224 | - | |
225 | - 1 : begin//router | |
226 | - {$IFDEF DEBUG} | |
227 | - WriteLn('Server1:'); | |
228 | - {$ENDIF} | |
229 | - // Exit; | |
230 | - if LMessagesCount > 2 then | |
231 | - begin | |
232 | - FRouter.recv(LMultipartMessage); | |
233 | - FMessage := LMultipartMessage; | |
234 | - Synchronize(@RequestReceived); | |
235 | - LMultipartMessage := FMessage; | |
236 | - FRouter.send(LMultipartMessage); | |
237 | - end; | |
238 | - end; | |
239 | - end; | |
230 | + LMultipartMessage.Clear; | |
231 | + {$IFDEF DEBUG} | |
232 | + WriteLn('pull':LPollCount); | |
233 | + {$ENDIF} | |
234 | + LMessagesCount := FPuller_PUB.recv(LMultipartMessage); | |
235 | + if LMessagesCount > 0 then | |
236 | + begin | |
237 | + FMessage := LMultipartMessage; | |
238 | + Synchronize(@MessageReceived); | |
239 | + FPublisher.send(LMultiPartMessage); | |
240 | + end; | |
241 | + end; | |
240 | 242 | |
243 | + if pePollIn in FPoller.PollItem[1].revents then | |
244 | + begin | |
245 | + LMultipartMessage.Clear; | |
246 | + {$IFDEF DEBUG} | |
247 | + WriteLn('rep:',LPollCount); | |
248 | + {$ENDIF} | |
249 | + LMessagesCount := FPuller_REP.recv(LMultipartMessage); | |
250 | + if LMessagesCount > 2 then | |
251 | + begin | |
252 | + FMessage := LMultipartMessage; | |
253 | + Synchronize(@RequestReceived); LMultipartMessage := FMessage; S := TStringList.Create; | |
254 | + FReplier.recv(S); S.Free; | |
255 | + FReplier.send(LMultipartMessage); | |
256 | + end; | |
241 | 257 | end; |
242 | 258 | end; |
243 | 259 | end; |
244 | 260 | |
245 | -constructor TZMQServerThread.Create(CreateSuspended: Boolean); | |
261 | +constructor TZMQServerThread.Create(AID: UTF8String; CreateSuspended: Boolean); | |
246 | 262 | begin |
247 | 263 | FreeOnTerminate := True; |
248 | 264 | FContext := TZMQContext.create; |
249 | 265 | |
250 | 266 | // publisher for subscribers |
251 | 267 | FPublisher := FContext.Socket( stPub ); // server don't need to subscribe to itself |
268 | + FPublisher.bind(CHost+CPortPublisher); | |
252 | 269 | |
253 | 270 | // pull from inside and outside |
254 | - FPuller := FContext.Socket( stPull ); | |
271 | + FPuller_PUB := FContext.Socket( stPull ); | |
272 | + FPuller_PUB.bind(CHost+CPortPuller_PUB); | |
255 | 273 | |
256 | 274 | // pushes from inside to outside |
257 | - FPusher := FContext.Socket( stPush ); | |
258 | - FPusher.connect(CLocalHost+CPortPuller); | |
275 | + FPusher_PUB := FContext.Socket( stPush ); | |
276 | + FPusher_PUB.connect(CLocalHost+CPortPuller_PUB); | |
259 | 277 | |
260 | 278 | // reply requests from outside |
261 | - FRouter := FContext.Socket( stRouter ); | |
279 | + FPuller_REP := FContext.Socket( stPull ); | |
280 | + FPuller_REP.bind(CHost+CPortPuller_REP); | |
281 | + //FRouter := FContext.Socket( stRouter ); | |
282 | + //FRouter.Identity:=AID; | |
283 | + //FRouter.bind(CHost+CPortRouter); | |
262 | 284 | |
263 | - // local setup | |
264 | - FPublisher.bind(CHost+CPortPublisher); | |
265 | - FPuller.bind(CHost+CPortPuller); | |
266 | - FRouter.bind(CHost+CPortRouter); | |
285 | + // blocking server thread for now | |
286 | + FReplier := FContext.Socket( stRep ); | |
287 | + FReplier.bind(CHost+CPortReplier); | |
267 | 288 | |
268 | 289 | // handle sockets |
269 | 290 | FPoller := TZMQPoller.Create(True, FContext); |
270 | - FPoller.Register(FPuller,[pePollIn],True); | |
271 | - FPoller.Register(FRouter, [pePollIn], True); | |
291 | + FPoller.Register(FPuller_PUB,[pePollIn],True); | |
292 | + FPoller.Register(FPuller_REP,[pePollIn],True); | |
293 | + //FPoller.Register(FRouter, [pePollIn], True); | |
272 | 294 | |
273 | 295 | inherited Create(CreateSuspended); |
274 | 296 | end; |
... | ... | @@ -277,9 +299,10 @@ destructor TZMQServerThread.Destroy; |
277 | 299 | begin |
278 | 300 | FPoller.Terminate; |
279 | 301 | FPoller.Free; |
280 | - FRouter.Free; | |
281 | - FPusher.Free; | |
282 | - FPuller.Free; | |
302 | + //FRouter.Free; | |
303 | + FPuller_REP.Free; | |
304 | + FPusher_PUB.Free; | |
305 | + FPuller_PUB.Free; | |
283 | 306 | FPublisher.Free; |
284 | 307 | FContext.Free; |
285 | 308 | inherited Destroy; |
... | ... | @@ -287,7 +310,7 @@ end; |
287 | 310 | |
288 | 311 | procedure TZMQServerThread.Push(AMultipartMessage: array of UTF8string); |
289 | 312 | begin |
290 | - FPusher.send(AMultipartMessage); | |
313 | + FPusher_PUB.send(AMultipartMessage); | |
291 | 314 | end; |
292 | 315 | |
293 | 316 | ... | ... |