示例#1
0
        // 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");
        }
示例#2
0
文件: Server.cs 项目: 2DSVD/old_projs
        // 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;
                            }
                            }
                        }
                    }
                }
            }
        }
示例#3
0
        // 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);
            }
        }