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 | ... | ... |