示例#1
0
        public void HandleClient(object obj)
        {
            // retrieve client from parameter passed to thread
            TcpClient client = (TcpClient)obj;

            // set two streams
            StreamWriter sWriter = new StreamWriter(client.GetStream(), Encoding.ASCII);
            StreamReader sReader = new StreamReader(client.GetStream(), Encoding.ASCII);

            Boolean isConnected = true;
            String  sData;

            while (isConnected)
            {
                // reads from stream
                try
                {
                    sData = sReader.ReadLine();
                    if (sData == null)
                    {
                        break;
                    }
                }
                catch (IOException e)
                {
                    Console.WriteLine(e.Message);
                    break;
                }
                Console.WriteLine("Got data from client: " + sData);
                if (sData.StartsWith("POST"))
                {
                    ReceivedData.Add(sData.TrimStart(new char[] { 'P', 'O', 'S', 'T', ' ' }));
                }
                else if (sData.StartsWith("GET"))
                {
                    if (ReceivedData.Count == 0)
                    {
                        sWriter.WriteLine("No words available.");
                    }
                    else
                    {
                        string[] splitString = ReceivedData[ReceivedData.Count - 1].Split(new char[] { ' ' });
                        ReceivedData.RemoveAt(ReceivedData.Count - 1);
                        //"GET QS / BT / BS lorem ipsum
                        string[]  method    = sData.Split(new char[] { ' ' });
                        Stopwatch stopWatch = new Stopwatch();
                        stopWatch.Start();
                        switch (method[1])
                        {
                        case "BS":
                        {
                            IEnumerable <IGrouping <string, string> > groupCount = splitString.GroupBy(w => w);
                            List <Bubble> bubbles = new List <Bubble>();
                            foreach (IGrouping <string, string> group in groupCount)
                            {
                                bubbles.Add(new Bubble(group.Key, group.Count()));
                            }
                            bubbles = BubbleSort.Sort(bubbles);
                            string s = "";
                            foreach (Bubble b in bubbles)
                            {
                                s = s + b.Word + " " + b.Count + ", ";
                            }
                            s = s.TrimEnd(new char[] { ',', ' ' });
                            stopWatch.Stop();
                            Console.WriteLine("BubbleSort finished sorting in: " + stopWatch.ElapsedMilliseconds);
                            sWriter.WriteLine(s);
                            break;
                        }

                        case "BT":
                        {
                            IEnumerable <IGrouping <string, string> > groupCount = splitString.GroupBy(w => w);
                            BinaryTree <int, string> bt = new BinaryTree <int, string>();
                            foreach (IGrouping <string, string> group in groupCount)
                            {
                                bt.Add(group.Count(), group.Key);
                            }
                            stopWatch.Stop();
                            Console.WriteLine("BinaryTree finished sorting in: " + stopWatch.ElapsedMilliseconds);
                            sWriter.WriteLine(bt.PrintTree(BinaryTree <int, string> .TraversalMethod.Inorder, BinaryTree <int, string> .TraversalDirection.Backwards));
                            break;
                        }

                        case "QS":
                        {
                            QuickSort qs = new QuickSort();
                            Dictionary <string, WordCount> wordCountDict = new Dictionary <string, WordCount>();
                            foreach (string temp in splitString)
                            {
                                if (wordCountDict.ContainsKey(temp))
                                {
                                    wordCountDict[temp].Count++;
                                }
                                else
                                {
                                    wordCountDict.Add(temp, new WordCount(temp, 1));
                                }
                            }
                            WordCount[] wordCountList = new WordCount[wordCountDict.Count];

                            wordCountList = qs.Sort(wordCountDict.Values.ToArray());
                            string s = "";
                            for (int i = 0; i < wordCountList.Length; i++)
                            {
                                s = s + wordCountList[i].Word + " " + wordCountList[i].Count;
                                if (i < wordCountList.Length - 1)
                                {
                                    s = s + ", ";
                                }
                            }
                            stopWatch.Stop();
                            Console.WriteLine("BinaryTree finished sorting in: " + stopWatch.ElapsedMilliseconds);
                            sWriter.WriteLine(s);
                            break;
                        }

                        default:
                        {
                            sWriter.WriteLine("No sorting method chosen.");
                            break;
                        }
                        }
                    }
                }
                else
                {
                    sWriter.WriteLine("Wrong header");
                }
                sWriter.Flush();
            }
            Console.WriteLine("Connection closed to client.");
        }