Ejemplo n.º 1
0
        private void ReceiveData(object socket)
        {
            RequestHeader requestHeader = new RequestHeader();
            var           clientSocket  = socket as Socket;

            Byte[]     buffer        = new Byte[1024];
            IPEndPoint clientep      = (IPEndPoint)clientSocket.RemoteEndPoint;
            string     clientMessage = string.Empty;

            try
            {
                clientSocket.Receive(buffer, 0, buffer.Length, SocketFlags.None);
                clientMessage = System.Text.Encoding.Default.GetString(buffer);
                Console.WriteLine(clientMessage);
            }
            catch (Exception ex)
            {
                StringBuilder sb = new StringBuilder();
                sb.AppendFormat("<html><head><title>Server throw an exception:{1}</title></head><body>{0}</body></html>", ex.Message, ex.GetType().FullName);
                var data = Encoding.ASCII.GetBytes(sb.ToString());
                clientSocket.Send(data, data.Length, SocketFlags.None);
            }

            using (StringReader sr = new StringReader(clientMessage))
            {
                StringBuilder sb   = new StringBuilder();
                var           line = sr.ReadLine();
                if (!string.IsNullOrWhiteSpace(line))
                {
                    string[] headerInfo = line.Split(new char[] { ' ' });
                    if (headerInfo.Length == 3)
                    {
                        requestHeader.SetHeader(headerInfo[0], headerInfo[1], headerInfo[2]);
                        switch (requestHeader.Method.ToUpper())
                        {
                        case "GET":
                            for (line = sr.ReadLine(); !string.IsNullOrWhiteSpace(line); line = sr.ReadLine())
                            {
                                string[] tokens = line.Split(new string[] { ": " }, StringSplitOptions.None);
                                if (tokens.Length == 2)
                                {
                                    requestHeader.Properties.Add(tokens[0], tokens[1]);
                                }
                                else
                                {
                                    Console.WriteLine(line);
                                }
                            }
                            writesuccess(sb, requestHeader);
                            sb.AppendFormat("<html><head><title>You request {1}</title></head><body><h2>Welcome to aocwes http server</h2>{0}<h3><div><h3>Your requested content:</h3>{2}</div>Author: <a href='mailto:flyear.cheng2gmail.com'>Flyear</a></h3></body></html>", requestHeader.ToString(), requestHeader.Url, clientMessage);
                            var data = Encoding.ASCII.GetBytes(sb.ToString());
                            clientSocket.Send(data, data.Length, SocketFlags.None);
                            Console.WriteLine(string.Format("ClientAddress:{0}, Request Url:{1}", clientep.Address, requestHeader.Url));
                            break;

                        case "POST":
                        case "HEAD":
                        case "PUT":
                        case "DELETE":
                        case "TRACE":
                        case "CONNECT":
                        case "OPTIONS":
                        default:
                            writesuccess(sb, requestHeader);
                            sb.AppendFormat("<html><head><title>You request {1}</title></head><body><h2>Welcome to aocwes http server</h2>{0}<h3>Author: <a href='mailto:flyear.cheng2gmail.com'>Flyear</a></h3></body></html>", requestHeader.ToString(), requestHeader.Url);
                            var data1 = Encoding.ASCII.GetBytes(sb.ToString());
                            clientSocket.Send(data1, data1.Length, SocketFlags.None);

                            break;
                        }
                    }
                    else
                    {
                        Console.WriteLine(line);
                    }
                }
            }
            clientSocket.Shutdown(SocketShutdown.Both);
        }