// Sends ending request to GW. This allow GW to remove client from list and to shut down workers if needed public void EndRequest() { var server = new ZSocket(ZSocketType.REQ); server.Connect("tcp://" + GW_IP + ":5555"); var request = new StartReq { UserId = Id, desire = false }; using (var responseStream = new MemoryStream()) { Serializer.Serialize(responseStream, request); server.Send(new ZFrame(responseStream.ToArray())); } server.ReceiveFrame(); server.Disconnect("tcp://" + GW_IP + ":5555"); }
// Main function. It is capable of invoking new workers, adding and removing clients and transfering requests and replies between them public void Broker() { ZMessage incoming; ZError error; var poll = ZPollItem.CreateReceiver(); while (!_stopLoops) { if (workers_socket.PollIn(poll, out incoming, out error, TimeSpan.FromMilliseconds(64))) { string worker_id = incoming[0].ReadString(); workers.Add(worker_id); string client_id = incoming[2].ReadString(); if (client_id != "READY") { using (var outgoing = new ZMessage()) { var response = Serializer.Deserialize <Response>(incoming[4]); var res = response as ClaimRes; if (res.Ok) { //Console.WriteLine(res.Ok.ToString() + " " + res.Position[0].ToString() + " " + res.Position[1].ToString() + " " + res.UserId.ToString()); playfield[res.Position[0] - 1, res.Position[1] - 1] = res.UserId; } outgoing.Add(incoming[2]); outgoing.Add(new ZFrame()); outgoing.Add(incoming[4]); users_socket.Send(outgoing); requests++; } } } if (workers.Count > 0) { while (toRemove > 0) { toRemove--; var request = new StartReq() { desire = true }; using (var message = new ZMessage()) using (var responseStream = new MemoryStream()) { message.Add(new ZFrame(workers[0])); message.Add(new ZFrame()); message.Add(new ZFrame()); message.Add(new ZFrame()); Serializer.Serialize(responseStream, request); message.Add(new ZFrame(responseStream.ToArray())); workers_socket.Send(message); } while (workers.Count == 0) { Thread.Sleep(10); } } if (users_socket.PollIn(poll, out incoming, out error, TimeSpan.FromMilliseconds(64))) { using (var receivedFrame = incoming[2]) { var request = Serializer.Deserialize <Request>(receivedFrame); //Console.WriteLine(request.RequesType); switch (request.RequesType) { case RequesType.ClaimReq: { using (var outgoing = new ZMessage()) { outgoing.Add(new ZFrame(workers[0])); outgoing.Add(new ZFrame()); outgoing.Add(incoming[0]); outgoing.Add(new ZFrame()); outgoing.Add(incoming[2]); workers_socket.Send(outgoing); } workers.RemoveAt(0); break; } case RequesType.StartReq: { var sr = request as StartReq; //Console.WriteLine(request.RequesType); var response = new StartRes(); response.size = size; if (sr.desire) { if (users.Contains(request.UserId)) { response.Ok = false; } else { response.Ok = true; response.Position = new List <int> { _random.Next(0, size), _random.Next(0, size) }; users.Add(request.UserId); playfield[response.Position[0], response.Position[1]] = request.UserId; requests++; if ((users.Count == 2) || (users.Count / 10 > workerCount)) { Process.Start(workersList[workerCount % workersList.Count], size.ToString() + " " + (++workerCount).ToString() + " " + myAdress); Console.WriteLine("New worker added, id: " + workerCount); } Console.WriteLine("New user added, id: {0}, symbol: {0}", request.UserId); } } else { users.Remove(request.UserId); if (users.Count == 1 || ((users.Count) % 10 == 0 && users.Count > 0)) { toRemove++; } Console.WriteLine("User removed, id: {0}, symbol: {0}", request.UserId); response.Ok = true; for (int i = 0; i < size; ++i) { for (int j = 0; j < size; ++j) { if (playfield[i, j] == request.UserId) { playfield[i, j] = 0; } } } } using (var responseStream = new MemoryStream()) using (var outgoing = new ZMessage()) { Serializer.Serialize(responseStream, response); outgoing.Add(incoming[0]); outgoing.Add(new ZFrame()); outgoing.Add(new ZFrame(responseStream.ToArray())); users_socket.Send(outgoing); } break; } } } } } } }
// Sends starting request to GW. This allows GW to include the client into a special list and to invoke new workers if needed public int StartRequest(ZSocket _server) { Console.WriteLine("Please insert your ID:"); var userId = 0; while (true) { while (!Int32.TryParse(Console.ReadLine(), out userId)) { Console.WriteLine("Wrong! Please insert your ID:"); } if (userId < 1 || userId > 99) { Console.WriteLine("Please use ID from 1 to 99"); continue; } break; } Id = userId; try { var request = new StartReq { UserId = Id, desire = true }; using (var responseStream = new MemoryStream()) { Serializer.Serialize(responseStream, request); _server.Send(new ZFrame(responseStream.ToArray())); } using (var receiveFrame = _server.ReceiveFrame()) { var reply = Serializer.Deserialize <Response>(receiveFrame); var sr = reply as StartRes; if (sr.Ok) { size = sr.size; playfield = new int[size, size]; for (int i = 0; i < size; ++i) { for (int j = 0; j < size; ++j) { playfield[i, j] = 0; } } //playfield[sr.Position[0], sr.Position[1]] = Id; Console.WriteLine("Your starting tile is {0}, {1}", sr.Position[0] + 1, sr.Position[1] + 1); Console.WriteLine("Wait for the end of the turn."); return(1); } else { Console.WriteLine("This ID is already occupied"); return(0); } } } catch (Exception e) { Console.WriteLine(e); return(-1); } }