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,7 +38,7 @@ | ||
38 | <PackageName Value="LCL"/> | 38 | <PackageName Value="LCL"/> |
39 | </Item3> | 39 | </Item3> |
40 | </RequiredPackages> | 40 | </RequiredPackages> |
41 | - <Units Count="19"> | 41 | + <Units Count="17"> |
42 | <Unit0> | 42 | <Unit0> |
43 | <Filename Value="cultural_matrix.lpr"/> | 43 | <Filename Value="cultural_matrix.lpr"/> |
44 | <IsPartOfProject Value="True"/> | 44 | <IsPartOfProject Value="True"/> |
@@ -113,17 +113,9 @@ | @@ -113,17 +113,9 @@ | ||
113 | <IsPartOfProject Value="True"/> | 113 | <IsPartOfProject Value="True"/> |
114 | </Unit15> | 114 | </Unit15> |
115 | <Unit16> | 115 | <Unit16> |
116 | - <Filename Value="units/zmq_network.pas"/> | ||
117 | - <IsPartOfProject Value="True"/> | ||
118 | - </Unit16> | ||
119 | - <Unit17> | ||
120 | <Filename Value="units/zmq_network3.pas"/> | 116 | <Filename Value="units/zmq_network3.pas"/> |
121 | <IsPartOfProject Value="True"/> | 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 | </Units> | 119 | </Units> |
128 | </ProjectOptions> | 120 | </ProjectOptions> |
129 | <CompilerOptions> | 121 | <CompilerOptions> |
cultural_matrix.lpr
@@ -40,7 +40,7 @@ begin | @@ -40,7 +40,7 @@ begin | ||
40 | if FileExists(F) then | 40 | if FileExists(F) then |
41 | try | 41 | try |
42 | ID.LoadFromFile(F); | 42 | ID.LoadFromFile(F); |
43 | - F := ID.Text; | 43 | + F := Copy(ID.Text,0,Length(ID.Text)-2); |
44 | finally | 44 | finally |
45 | ID.Free; | 45 | ID.Free; |
46 | end | 46 | end |
@@ -48,7 +48,7 @@ begin | @@ -48,7 +48,7 @@ begin | ||
48 | try | 48 | try |
49 | ID.Text := s_random(32); | 49 | ID.Text := s_random(32); |
50 | ID.SaveToFile(F); | 50 | ID.SaveToFile(F); |
51 | - F := ID.Text; | 51 | + F := Copy(ID.Text,0,Length(ID.Text)-2); |
52 | except | 52 | except |
53 | on E: Exception do | 53 | on E: Exception do |
54 | begin | 54 | begin |
form_chooseactor.lfm
@@ -3,7 +3,7 @@ object FormChooseActor: TFormChooseActor | @@ -3,7 +3,7 @@ object FormChooseActor: TFormChooseActor | ||
3 | Height = 240 | 3 | Height = 240 |
4 | Top = 194 | 4 | Top = 194 |
5 | Width = 320 | 5 | Width = 320 |
6 | - BorderStyle = bsNone | 6 | + BorderStyle = bsDialog |
7 | Caption = 'FormChooseActor' | 7 | Caption = 'FormChooseActor' |
8 | ClientHeight = 240 | 8 | ClientHeight = 240 |
9 | ClientWidth = 320 | 9 | ClientWidth = 320 |
form_chooseactor.pas
@@ -71,7 +71,7 @@ end; | @@ -71,7 +71,7 @@ end; | ||
71 | 71 | ||
72 | procedure TFormChooseActor.FormCreate(Sender: TObject); | 72 | procedure TFormChooseActor.FormCreate(Sender: TObject); |
73 | begin | 73 | begin |
74 | - FCanClose := False | 74 | + FCanClose := True; |
75 | end; | 75 | end; |
76 | 76 | ||
77 | procedure TFormChooseActor.SetStyle(AValue: string); | 77 | procedure TFormChooseActor.SetStyle(AValue: string); |
form_matrixgame.pas
@@ -212,21 +212,20 @@ procedure TFormMatrixGame.SetGameActor(AValue: TGameActor); | @@ -212,21 +212,20 @@ procedure TFormMatrixGame.SetGameActor(AValue: TGameActor); | ||
212 | 212 | ||
213 | procedure SetZMQAdmin; | 213 | procedure SetZMQAdmin; |
214 | begin | 214 | begin |
215 | - | ||
216 | - FGameControl := TGameControl.Create(TZMQAdmin.Create(Self),FID); | 215 | + FGameControl := TGameControl.Create(TZMQAdmin.Create(Self,FID)); |
217 | GBAdmin.Visible:= True; | 216 | GBAdmin.Visible:= True; |
218 | end; | 217 | end; |
219 | 218 | ||
220 | procedure SetZMQPlayer; | 219 | procedure SetZMQPlayer; |
221 | begin | 220 | begin |
222 | - FGameControl := TGameControl.Create(TZMQPlayer.Create(Self),FID); | 221 | + FGameControl := TGameControl.Create(TZMQPlayer.Create(Self,FID)); |
223 | btnConfirmRow.Visible := True; | 222 | btnConfirmRow.Visible := True; |
224 | StringGridMatrix.Enabled := True; | 223 | StringGridMatrix.Enabled := True; |
225 | end; | 224 | end; |
226 | 225 | ||
227 | procedure SetZMQWatcher; | 226 | procedure SetZMQWatcher; |
228 | begin | 227 | begin |
229 | - FGameControl := TGameControl.Create(TZMQWatcher.Create(Self),FID); | 228 | + //FGameControl := TGameControl.Create(TZMQWatcher.Create(Self,FID)); |
230 | end; | 229 | end; |
231 | 230 | ||
232 | begin | 231 | begin |
units/game_control.pas
@@ -43,7 +43,7 @@ type | @@ -43,7 +43,7 @@ type | ||
43 | procedure SetRowBase(AValue: integer); | 43 | procedure SetRowBase(AValue: integer); |
44 | procedure SendSystemMessage(AMessage: array of UTF8String); | 44 | procedure SendSystemMessage(AMessage: array of UTF8String); |
45 | public | 45 | public |
46 | - constructor Create(AZMQActor : TZMQActor;AID : string);overload; | 46 | + constructor Create(AOwner : TComponent);override; |
47 | destructor Destroy; override; | 47 | destructor Destroy; override; |
48 | procedure SetMatrix; | 48 | procedure SetMatrix; |
49 | procedure SendRequest(ARequest : UTF8string); | 49 | procedure SendRequest(ARequest : UTF8string); |
@@ -129,6 +129,8 @@ end; | @@ -129,6 +129,8 @@ end; | ||
129 | 129 | ||
130 | function TGameControl.MessageHas(const A_CONST: string; AMessage: TStringList): Boolean; | 130 | function TGameControl.MessageHas(const A_CONST: string; AMessage: TStringList): Boolean; |
131 | begin | 131 | begin |
132 | + Result:= False; | ||
133 | + if not Assigned(AMessage) then Exit; | ||
132 | Result := Pos(A_CONST,AMessage[0])>0; | 134 | Result := Pos(A_CONST,AMessage[0])>0; |
133 | end; | 135 | end; |
134 | 136 | ||
@@ -210,13 +212,14 @@ end; | @@ -210,13 +212,14 @@ end; | ||
210 | 212 | ||
211 | procedure TGameControl.SendSystemMessage(AMessage: array of UTF8String); | 213 | procedure TGameControl.SendSystemMessage(AMessage: array of UTF8String); |
212 | begin | 214 | begin |
213 | - TZMQAdmin(FZMQActor).SendMessage(AMessage); | 215 | + //TZMQAdmin(FZMQActor).SendMessage(AMessage); |
214 | end; | 216 | end; |
215 | 217 | ||
216 | -constructor TGameControl.Create(AZMQActor: TZMQActor; AID: string); | 218 | +constructor TGameControl.Create(AOwner: TComponent); |
217 | begin | 219 | begin |
218 | - inherited Create(AZMQActor.Owner); | ||
219 | - FZMQActor := AZMQActor; | 220 | + FZMQActor := TZMQActor(AOwner); |
221 | + inherited Create(FZMQActor.Owner); | ||
222 | + FID := FZMQActor.ID; | ||
220 | FZMQActor.OnMessageReceived:=@ReceiveMessage; | 223 | FZMQActor.OnMessageReceived:=@ReceiveMessage; |
221 | FZMQActor.OnRequestReceived:=@ReceiveRequest; | 224 | FZMQActor.OnRequestReceived:=@ReceiveRequest; |
222 | FZMQActor.OnReplyReceived:=@ReceiveReply; | 225 | FZMQActor.OnReplyReceived:=@ReceiveReply; |
@@ -233,10 +236,7 @@ begin | @@ -233,10 +236,7 @@ begin | ||
233 | MustDrawDots:=False; | 236 | MustDrawDots:=False; |
234 | MustDrawDotsClear:=False; | 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 | SendRequest(K_LOGIN); | 240 | SendRequest(K_LOGIN); |
241 | end; | 241 | end; |
242 | 242 | ||
@@ -251,33 +251,55 @@ begin | @@ -251,33 +251,55 @@ begin | ||
251 | end; | 251 | end; |
252 | 252 | ||
253 | procedure TGameControl.SendRequest(ARequest: UTF8string); | 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 | begin | 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 | end; | 284 | end; |
257 | 285 | ||
258 | 286 | ||
259 | procedure TGameControl.SendMessage(AMessage: UTF8string); | 287 | procedure TGameControl.SendMessage(AMessage: UTF8string); |
260 | var | 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 | var i : integer; | 292 | var i : integer; |
268 | begin | 293 | begin |
269 | SetLength(M,Length(A)); | 294 | SetLength(M,Length(A)); |
270 | for i := 0 to Length(A) -1 do | 295 | for i := 0 to Length(A) -1 do |
271 | M[i] := A[i]; | 296 | M[i] := A[i]; |
272 | end; | 297 | end; |
273 | - | ||
274 | begin | 298 | begin |
275 | case AMessage of | 299 | case AMessage of |
276 | K_ARRIVED : SetM([ | 300 | K_ARRIVED : SetM([ |
277 | AMessage | 301 | AMessage |
278 | , FZMQActor.ID | 302 | , FZMQActor.ID |
279 | - //, FZMQActor.ClassType.ClassName; | ||
280 | - //, | ||
281 | ]); | 303 | ]); |
282 | 304 | ||
283 | K_CHOICE : SetM([ | 305 | K_CHOICE : SetM([ |
@@ -318,15 +340,13 @@ begin | @@ -318,15 +340,13 @@ begin | ||
318 | // M[0] := GA_WATCHER+M[0]; | 340 | // M[0] := GA_WATCHER+M[0]; |
319 | end; | 341 | end; |
320 | FZMQActor.SendMessage(M); | 342 | FZMQActor.SendMessage(M); |
321 | - | ||
322 | -{$IFDEF DEBUG} | ||
323 | - for i := 0 to Length(M)-1 do | ||
324 | - WriteLn(M[i]); | ||
325 | -{$ENDIF} | ||
326 | end; | 343 | end; |
327 | 344 | ||
328 | procedure TGameControl.ReceiveMessage(AMessage: TStringList); | 345 | procedure TGameControl.ReceiveMessage(AMessage: TStringList); |
329 | - | 346 | +{$IFDEF DEBUG} |
347 | +var | ||
348 | + i : integer; | ||
349 | +{$ENDIF} | ||
330 | function MHas(const C : string) : Boolean; | 350 | function MHas(const C : string) : Boolean; |
331 | begin | 351 | begin |
332 | Result := MessageHas(C,AMessage); | 352 | Result := MessageHas(C,AMessage); |
@@ -508,17 +528,51 @@ begin | @@ -508,17 +528,51 @@ begin | ||
508 | if MHas(K_LEFT) then SayGoodBye; | 528 | if MHas(K_LEFT) then SayGoodBye; |
509 | if MHas(K_RESUME) then ResumeActor; | 529 | if MHas(K_RESUME) then ResumeActor; |
510 | if MHas(K_STATUS) then ReceiveStatus; | 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 | end; | 537 | end; |
512 | 538 | ||
513 | procedure TGameControl.ReceiveRequest(var ARequest: TStringList); | 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 | begin | 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 | end; | 561 | end; |
517 | 562 | ||
563 | + | ||
564 | +// player | ||
518 | procedure TGameControl.ReceiveReply(AReply: TStringList); | 565 | procedure TGameControl.ReceiveReply(AReply: TStringList); |
566 | +var i: integer; | ||
519 | begin | 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 | end; | 573 | end; |
522 | 574 | ||
575 | + | ||
576 | + | ||
523 | end. | 577 | end. |
524 | 578 |
units/game_zmq_actors.pas
@@ -16,18 +16,17 @@ type | @@ -16,18 +16,17 @@ type | ||
16 | 16 | ||
17 | TZMQActor = class(TComponent) | 17 | TZMQActor = class(TComponent) |
18 | private | 18 | private |
19 | - FID: UTF8string; | ||
20 | FOnMessageReceived : TMessRecvProc; | 19 | FOnMessageReceived : TMessRecvProc; |
21 | FOnReplyReceived: TMessRecvProc; | 20 | FOnReplyReceived: TMessRecvProc; |
22 | FOnRequestReceived: TReqRecvProc; | 21 | FOnRequestReceived: TReqRecvProc; |
23 | protected | 22 | protected |
23 | + FID: UTF8string; | ||
24 | procedure MessageReceived(AMultipartMessage : TStringList); | 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 | public | 27 | public |
28 | - constructor Create(AOwner : TComponent); override; | 28 | + constructor Create(AOwner : TComponent; AID : UTF8String); virtual; overload; |
29 | procedure Start; virtual; | 29 | procedure Start; virtual; |
30 | - procedure SetID(S:string); virtual; | ||
31 | procedure SendMessage(AMessage : array of UTF8string);virtual;abstract; | 30 | procedure SendMessage(AMessage : array of UTF8string);virtual;abstract; |
32 | procedure Request(ARequest : array of UTF8string);virtual;abstract; | 31 | procedure Request(ARequest : array of UTF8string);virtual;abstract; |
33 | property OnMessageReceived : TMessRecvProc read FOnMessageReceived write FOnMessageReceived; | 32 | property OnMessageReceived : TMessRecvProc read FOnMessageReceived write FOnMessageReceived; |
@@ -41,10 +40,8 @@ type | @@ -41,10 +40,8 @@ type | ||
41 | TZMQPlayer = class(TZMQActor) | 40 | TZMQPlayer = class(TZMQActor) |
42 | private | 41 | private |
43 | FZMQClient : TZMQClientThread; | 42 | FZMQClient : TZMQClientThread; |
44 | - protected | ||
45 | - procedure ReplyReceived(AMultipartMessage: TStringList); override; | ||
46 | public | 43 | public |
47 | - constructor Create(AOwner : TComponent); override; | 44 | + constructor Create(AOwner : TComponent; AID : UTF8String); override; |
48 | destructor Destroy; override; | 45 | destructor Destroy; override; |
49 | procedure Start; override; | 46 | procedure Start; override; |
50 | procedure SendMessage(AMessage : array of UTF8string); override; | 47 | procedure SendMessage(AMessage : array of UTF8string); override; |
@@ -56,10 +53,8 @@ type | @@ -56,10 +53,8 @@ type | ||
56 | TZMQAdmin = class(TZMQActor) | 53 | TZMQAdmin = class(TZMQActor) |
57 | private | 54 | private |
58 | FZMQServer : TZMQServerThread; | 55 | FZMQServer : TZMQServerThread; |
59 | - protected | ||
60 | - procedure RequestReceived(var AMultipartMessage: TStringList); override; | ||
61 | public | 56 | public |
62 | - constructor Create(AOwner : TComponent); override; | 57 | + constructor Create(AOwner : TComponent; AID : UTF8String); override; |
63 | destructor Destroy; override; | 58 | destructor Destroy; override; |
64 | procedure Start; override; | 59 | procedure Start; override; |
65 | procedure SendMessage(AMessage: array of UTF8string); override; | 60 | procedure SendMessage(AMessage: array of UTF8string); override; |
@@ -85,12 +80,14 @@ end; | @@ -85,12 +80,14 @@ end; | ||
85 | 80 | ||
86 | { TZMQAdmin } | 81 | { TZMQAdmin } |
87 | 82 | ||
88 | -constructor TZMQAdmin.Create(AOwner: TComponent); | 83 | +constructor TZMQAdmin.Create(AOwner: TComponent; AID: UTF8String); |
89 | begin | 84 | begin |
90 | inherited Create(AOwner); | 85 | inherited Create(AOwner); |
91 | - FZMQServer := TZMQServerThread.Create; | 86 | + FID:=AID; |
87 | + FZMQServer := TZMQServerThread.Create(AID); | ||
92 | FZMQServer.OnMessageReceived:=@MessageReceived; | 88 | FZMQServer.OnMessageReceived:=@MessageReceived; |
93 | FZMQServer.OnRequestReceived:=@RequestReceived; | 89 | FZMQServer.OnRequestReceived:=@RequestReceived; |
90 | + | ||
94 | end; | 91 | end; |
95 | 92 | ||
96 | destructor TZMQAdmin.Destroy; | 93 | destructor TZMQAdmin.Destroy; |
@@ -109,13 +106,9 @@ begin | @@ -109,13 +106,9 @@ begin | ||
109 | // do nothing, you are the server | 106 | // do nothing, you are the server |
110 | end; | 107 | end; |
111 | 108 | ||
112 | -procedure TZMQAdmin.RequestReceived(var AMultipartMessage: TStringList); | ||
113 | -begin | ||
114 | - if Assigned(FOnRequestReceived) then FOnRequestReceived(AMultipartMessage); | ||
115 | -end; | ||
116 | - | ||
117 | procedure TZMQAdmin.Start; | 109 | procedure TZMQAdmin.Start; |
118 | begin | 110 | begin |
111 | + inherited Start; | ||
119 | FZMQServer.Start; | 112 | FZMQServer.Start; |
120 | WriteLn('TZMQAdmin.Start'); | 113 | WriteLn('TZMQAdmin.Start'); |
121 | end; | 114 | end; |
@@ -132,15 +125,11 @@ begin | @@ -132,15 +125,11 @@ begin | ||
132 | FZMQClient.Request(ARequest); | 125 | FZMQClient.Request(ARequest); |
133 | end; | 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 | begin | 129 | begin |
142 | inherited Create(AOwner); | 130 | inherited Create(AOwner); |
143 | - FZMQClient := TZMQClientThread.Create; | 131 | + FID:=AID; |
132 | + FZMQClient := TZMQClientThread.Create(AID); | ||
144 | FZMQClient.OnMessageReceived:=@MessageReceived; | 133 | FZMQClient.OnMessageReceived:=@MessageReceived; |
145 | FZMQClient.OnReplyReceived:=@ReplyReceived; | 134 | FZMQClient.OnReplyReceived:=@ReplyReceived; |
146 | end; | 135 | end; |
@@ -160,11 +149,6 @@ end; | @@ -160,11 +149,6 @@ end; | ||
160 | 149 | ||
161 | { TZMQActor } | 150 | { TZMQActor } |
162 | 151 | ||
163 | -procedure TZMQActor.SetID(S: string); | ||
164 | -begin | ||
165 | - FID := S; | ||
166 | -end; | ||
167 | - | ||
168 | procedure TZMQActor.MessageReceived(AMultipartMessage: TStringList); | 152 | procedure TZMQActor.MessageReceived(AMultipartMessage: TStringList); |
169 | begin | 153 | begin |
170 | if Assigned(FOnMessageReceived) then FOnMessageReceived(AMultipartMessage); | 154 | if Assigned(FOnMessageReceived) then FOnMessageReceived(AMultipartMessage); |
@@ -172,15 +156,15 @@ end; | @@ -172,15 +156,15 @@ end; | ||
172 | 156 | ||
173 | procedure TZMQActor.ReplyReceived(AMultipartMessage: TStringList); | 157 | procedure TZMQActor.ReplyReceived(AMultipartMessage: TStringList); |
174 | begin | 158 | begin |
175 | - AbstractError; | 159 | + if Assigned(FOnReplyReceived) then FOnReplyReceived(AMultipartMessage); |
176 | end; | 160 | end; |
177 | 161 | ||
178 | procedure TZMQActor.RequestReceived(var AMultipartMessage: TStringList); | 162 | procedure TZMQActor.RequestReceived(var AMultipartMessage: TStringList); |
179 | begin | 163 | begin |
180 | - AbstractError; | 164 | + if Assigned(FOnRequestReceived) then FOnRequestReceived(AMultipartMessage); |
181 | end; | 165 | end; |
182 | 166 | ||
183 | -constructor TZMQActor.Create(AOwner: TComponent); | 167 | +constructor TZMQActor.Create(AOwner: TComponent; AID: UTF8String); |
184 | begin | 168 | begin |
185 | inherited Create(AOwner); | 169 | inherited Create(AOwner); |
186 | end; | 170 | end; |
units/zmq_network.pas
@@ -31,8 +31,10 @@ type | @@ -31,8 +31,10 @@ type | ||
31 | TZMQClientThread = class(TThread) | 31 | TZMQClientThread = class(TThread) |
32 | private | 32 | private |
33 | FContext : TZMQContext; | 33 | FContext : TZMQContext; |
34 | + FID: shortstring; | ||
34 | FSubscriber, | 35 | FSubscriber, |
35 | - FPusher, | 36 | + FPusher_PUB, |
37 | + FPusher_REQ, | ||
36 | FRequester : TZMQSocket; | 38 | FRequester : TZMQSocket; |
37 | FPoller : TZMQPoller; | 39 | FPoller : TZMQPoller; |
38 | FMessage : TStringList; | 40 | FMessage : TStringList; |
@@ -42,25 +44,28 @@ type | @@ -42,25 +44,28 @@ type | ||
42 | protected | 44 | protected |
43 | procedure Execute; override; | 45 | procedure Execute; override; |
44 | public | 46 | public |
45 | - constructor Create(CreateSuspended: Boolean = True); | 47 | + constructor Create(AID : UTF8String; CreateSuspended: Boolean = True); overload; |
46 | destructor Destroy; override; | 48 | destructor Destroy; override; |
47 | procedure Request(AMultipartMessage : array of UTF8String); | 49 | procedure Request(AMultipartMessage : array of UTF8String); |
48 | procedure Push(AMultipartMessage : array of UTF8String); | 50 | procedure Push(AMultipartMessage : array of UTF8String); |
49 | property OnMessageReceived : TMessRecvProc read FOnMessageReceived write FOnMessageReceived; | 51 | property OnMessageReceived : TMessRecvProc read FOnMessageReceived write FOnMessageReceived; |
50 | property OnReplyReceived : TMessRecvProc read FOnReplyReceived write FOnReplyReceived; | 52 | property OnReplyReceived : TMessRecvProc read FOnReplyReceived write FOnReplyReceived; |
53 | + property ID :shortstring read FID; | ||
51 | end; | 54 | end; |
52 | 55 | ||
53 | { TZMQServerThread } | 56 | { TZMQServerThread } |
54 | 57 | ||
55 | TZMQServerThread = class(TThread) | 58 | TZMQServerThread = class(TThread) |
56 | private | 59 | private |
60 | + FID: shortstring; | ||
57 | FOnMessageReceived: TMessRecvProc; | 61 | FOnMessageReceived: TMessRecvProc; |
58 | FOnRequestReceived: TReqRecvProc; | 62 | FOnRequestReceived: TReqRecvProc; |
59 | FContext : TZMQContext; | 63 | FContext : TZMQContext; |
60 | FPublisher, | 64 | FPublisher, |
61 | - FPuller, | ||
62 | - FPusher, | ||
63 | - FRouter, | 65 | + FPuller_PUB, |
66 | + FPusher_PUB, | ||
67 | + FPuller_REP, | ||
68 | + //FRouter, | ||
64 | FReplier : TZMQSocket; | 69 | FReplier : TZMQSocket; |
65 | FPoller : TZMQPoller; | 70 | FPoller : TZMQPoller; |
66 | FMessage : TStringList; | 71 | FMessage : TStringList; |
@@ -70,11 +75,12 @@ type | @@ -70,11 +75,12 @@ type | ||
70 | protected | 75 | protected |
71 | procedure Execute; override; | 76 | procedure Execute; override; |
72 | public | 77 | public |
73 | - constructor Create(CreateSuspended: Boolean = True); | 78 | + constructor Create(AID : UTF8String; CreateSuspended: Boolean = True); overload; |
74 | destructor Destroy; override; | 79 | destructor Destroy; override; |
75 | procedure Push(AMultipartMessage: array of UTF8string); | 80 | procedure Push(AMultipartMessage: array of UTF8string); |
76 | property OnMessageReceived : TMessRecvProc read FOnMessageReceived write FOnMessageReceived; | 81 | property OnMessageReceived : TMessRecvProc read FOnMessageReceived write FOnMessageReceived; |
77 | property OnRequestReceived : TReqRecvProc read FOnRequestReceived write FOnRequestReceived; | 82 | property OnRequestReceived : TReqRecvProc read FOnRequestReceived write FOnRequestReceived; |
83 | + property ID :shortstring read FID; | ||
78 | end; | 84 | end; |
79 | 85 | ||
80 | implementation | 86 | implementation |
@@ -83,8 +89,10 @@ const | @@ -83,8 +89,10 @@ const | ||
83 | CHost = 'tcp://*:'; | 89 | CHost = 'tcp://*:'; |
84 | CLocalHost = 'tcp://localhost:'; | 90 | CLocalHost = 'tcp://localhost:'; |
85 | CPortPublisher = '5056'; | 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 | { TZMQClientThread } | 98 | { TZMQClientThread } |
@@ -108,20 +116,22 @@ begin | @@ -108,20 +116,22 @@ begin | ||
108 | LPollEvent := FPoller.poll(50000); | 116 | LPollEvent := FPoller.poll(50000); |
109 | if LPollEvent > 0 then | 117 | if LPollEvent > 0 then |
110 | begin | 118 | begin |
111 | - WriteLn('Server4:FPoller:',FPoller.PollNumber); | ||
112 | LMessagesCount := FSubscriber.recv(LMultipartMessage); | 119 | LMessagesCount := FSubscriber.recv(LMultipartMessage); |
113 | if LMessagesCount > 0 then | 120 | if LMessagesCount > 0 then |
114 | begin | 121 | begin |
115 | FMessage := LMultipartMessage; | 122 | FMessage := LMultipartMessage; |
116 | Synchronize(@MessageReceived); | 123 | Synchronize(@MessageReceived); |
117 | end; | 124 | end; |
125 | + {$IFDEF DEBUG} | ||
126 | + WriteLn('Server4:FPoller:',FPoller.PollNumber); | ||
127 | + {$ENDIF} | ||
118 | end; | 128 | end; |
119 | end; | 129 | end; |
120 | LMultipartMessage.Free; | 130 | LMultipartMessage.Free; |
121 | end; | 131 | end; |
122 | 132 | ||
123 | 133 | ||
124 | -constructor TZMQClientThread.Create(CreateSuspended: Boolean); | 134 | +constructor TZMQClientThread.Create(AID: UTF8String; CreateSuspended: Boolean); |
125 | begin | 135 | begin |
126 | FreeOnTerminate := True; | 136 | FreeOnTerminate := True; |
127 | FContext := TZMQContext.create; | 137 | FContext := TZMQContext.create; |
@@ -130,12 +140,17 @@ begin | @@ -130,12 +140,17 @@ begin | ||
130 | FSubscriber := FContext.Socket( stSub ); | 140 | FSubscriber := FContext.Socket( stSub ); |
131 | FSubscriber.connect(CLocalHost+CPortPublisher);FSubscriber.Subscribe(''); | 141 | FSubscriber.connect(CLocalHost+CPortPublisher);FSubscriber.Subscribe(''); |
132 | // pushes to server | 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 | // request from server | 149 | // request from server |
137 | FRequester := FContext.Socket( stReq ); | 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 | // handle income messages | 155 | // handle income messages |
141 | FPoller := TZMQPoller.Create(True, FContext); | 156 | FPoller := TZMQPoller.Create(True, FContext); |
@@ -148,7 +163,8 @@ destructor TZMQClientThread.Destroy; | @@ -148,7 +163,8 @@ destructor TZMQClientThread.Destroy; | ||
148 | begin | 163 | begin |
149 | FPoller.Terminate; | 164 | FPoller.Terminate; |
150 | FPoller.Free; | 165 | FPoller.Free; |
151 | - FPusher.Free; | 166 | + FPusher_REQ.Free; |
167 | + FPusher_PUB.Free; | ||
152 | FSubscriber.Free; | 168 | FSubscriber.Free; |
153 | FContext.Free; | 169 | FContext.Free; |
154 | inherited Destroy; | 170 | inherited Destroy; |
@@ -158,15 +174,18 @@ procedure TZMQClientThread.Request(AMultipartMessage: array of UTF8String); | @@ -158,15 +174,18 @@ procedure TZMQClientThread.Request(AMultipartMessage: array of UTF8String); | ||
158 | var AReply : TStringList; | 174 | var AReply : TStringList; |
159 | begin | 175 | begin |
160 | AReply:=TStringList.Create; | 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 | if Assigned(FOnReplyReceived) then FOnReplyReceived(AReply); | 182 | if Assigned(FOnReplyReceived) then FOnReplyReceived(AReply); |
164 | AReply.Free; | 183 | AReply.Free; |
165 | end; | 184 | end; |
166 | 185 | ||
167 | procedure TZMQClientThread.Push(AMultipartMessage: array of UTF8String); | 186 | procedure TZMQClientThread.Push(AMultipartMessage: array of UTF8String); |
168 | begin | 187 | begin |
169 | - FPusher.send(AMultipartMessage); | 188 | + FPusher_PUB.send(AMultipartMessage); |
170 | end; | 189 | end; |
171 | 190 | ||
172 | 191 | ||
@@ -189,12 +208,12 @@ end; | @@ -189,12 +208,12 @@ end; | ||
189 | 208 | ||
190 | procedure TZMQServerThread.RequestReceived; | 209 | procedure TZMQServerThread.RequestReceived; |
191 | begin | 210 | begin |
192 | - if Assigned(FOnMessageReceived) then FOnMessageReceived(FMessage); | 211 | + if Assigned(FOnRequestReceived) then FOnRequestReceived(FMessage); |
193 | end; | 212 | end; |
194 | 213 | ||
195 | procedure TZMQServerThread.Execute; | 214 | procedure TZMQServerThread.Execute; |
196 | var | 215 | var |
197 | - LMultipartMessage : TStringList; | 216 | + LMultipartMessage, S : TStringList; |
198 | LPollCount, | 217 | LPollCount, |
199 | LMessagesCount : integer; | 218 | LMessagesCount : integer; |
200 | begin | 219 | begin |
@@ -204,71 +223,74 @@ begin | @@ -204,71 +223,74 @@ begin | ||
204 | LMultipartMessage := TStringList.Create; | 223 | LMultipartMessage := TStringList.Create; |
205 | while not Terminated do | 224 | while not Terminated do |
206 | begin | 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 | begin | 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 | end; | 257 | end; |
242 | end; | 258 | end; |
243 | end; | 259 | end; |
244 | 260 | ||
245 | -constructor TZMQServerThread.Create(CreateSuspended: Boolean); | 261 | +constructor TZMQServerThread.Create(AID: UTF8String; CreateSuspended: Boolean); |
246 | begin | 262 | begin |
247 | FreeOnTerminate := True; | 263 | FreeOnTerminate := True; |
248 | FContext := TZMQContext.create; | 264 | FContext := TZMQContext.create; |
249 | 265 | ||
250 | // publisher for subscribers | 266 | // publisher for subscribers |
251 | FPublisher := FContext.Socket( stPub ); // server don't need to subscribe to itself | 267 | FPublisher := FContext.Socket( stPub ); // server don't need to subscribe to itself |
268 | + FPublisher.bind(CHost+CPortPublisher); | ||
252 | 269 | ||
253 | // pull from inside and outside | 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 | // pushes from inside to outside | 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 | // reply requests from outside | 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 | // handle sockets | 289 | // handle sockets |
269 | FPoller := TZMQPoller.Create(True, FContext); | 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 | inherited Create(CreateSuspended); | 295 | inherited Create(CreateSuspended); |
274 | end; | 296 | end; |
@@ -277,9 +299,10 @@ destructor TZMQServerThread.Destroy; | @@ -277,9 +299,10 @@ destructor TZMQServerThread.Destroy; | ||
277 | begin | 299 | begin |
278 | FPoller.Terminate; | 300 | FPoller.Terminate; |
279 | FPoller.Free; | 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 | FPublisher.Free; | 306 | FPublisher.Free; |
284 | FContext.Free; | 307 | FContext.Free; |
285 | inherited Destroy; | 308 | inherited Destroy; |
@@ -287,7 +310,7 @@ end; | @@ -287,7 +310,7 @@ end; | ||
287 | 310 | ||
288 | procedure TZMQServerThread.Push(AMultipartMessage: array of UTF8string); | 311 | procedure TZMQServerThread.Push(AMultipartMessage: array of UTF8string); |
289 | begin | 312 | begin |
290 | - FPusher.send(AMultipartMessage); | 313 | + FPusher_PUB.send(AMultipartMessage); |
291 | end; | 314 | end; |
292 | 315 | ||
293 | 316 |