示例#1
0
 public static void Add(SortRequest request)
 {
     lock (_sort_stats) {
         SortState sortstate = new SortState ();
         sortstate.ID = request.ID;
         sortstate.State = State.queued;
         _sort_stats.AddFirst (sortstate); // свежие записи -- в начало списка, старые остаются в конце
     }
     lock (_sort_queue) {
         _sort_queue.Enqueue (request);
     }
 }
示例#2
0
        public Server(int port)
        {
            TcpListener Listener = new TcpListener (IPAddress.Any, port);
            Listener.Start();

            TcpClient Client = Listener.AcceptTcpClient (); // ждать подключение единственного клиента

            while (true) {
                string text = "";
                int count;
                byte[] buffer = new byte[1024];
                while (true) {
                    count = Client.GetStream ().Read (buffer, 0, buffer.Length);
                    text += Encoding.ASCII.GetString (buffer, 0, count);
                    if (text.IndexOf("\r\n\r\n") >=  0 || text.Length > 4096) {
                        break;
                    }
                } // ждать сообщение

                // parse
                string query = new string (text.Skip (6).TakeWhile (c => c != ' ').ToArray ());
                NameValueCollection qscoll = HttpUtility.ParseQueryString (query);

                if (qscoll.Keys [0] == "get") {
                    int id = Convert.ToInt32 (qscoll ["get"]);
                    SortState sortstate = Worker.GetState (id);
                    lock (sortstate) {
                        string data = sortstate.State == State.ready ? File.ReadAllText (sortstate.Filename) : null;
                        string json = "{\r\n\t\"state\": \"" + sortstate.State + "\"\r\n\t\"data\": [" + data + "]\r\n}";
                        Send (Client, buffer, json);
                    }

                } else if (qscoll.Keys [0] == "concurrency" && qscoll.Keys [1] == "sort") {
                    SortRequest res = new SortRequest ();
                    res.N = Convert.ToInt32 (qscoll ["concurrency"]);
                    res.Url = qscoll ["sort"];
                    Worker.Add (res);
                    Send (Client, buffer, res.ID.ToString ());
                } else {
                    Send (Client, buffer, ""); // ответ на запрос иконки, и т.п.
                }
            }
        }