-1

我创建了一个简单的 http 服务器,但不幸的是它工作错误。例如,当我使用网络浏览器时,服务器不会回复。但是当我使用 Fiddler 时,它回答了这个问题:

 HTTP/1.1 200 OK
 content-type: text/html
 content-length: 51

到底是怎么回事?PS。我使用插座。

服务器

static void Main(string[] args)
    {
        // Устанавливаем для сокета локальную конечную точку

        IPHostEntry ipHost = Dns.Resolve("192.168.1.103");
        IPAddress ipAddr = ipHost.AddressList[0];
        IPEndPoint ipEndPoint = new IPEndPoint(ipAddr, 8080); // Порт потом поменять 80

        // Создаем сокет Tcp/Ip

        Socket socketListener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        // Назначаем сокет локальной конечной точке и слушаем входящие

        try
        {
            socketListener.Bind(ipEndPoint);
            socketListener.Listen(10);

            //Начинаме слушать 

            while (true)
            {
                Console.WriteLine("Waiting for a connection on port {0}", ipEndPoint);

                Socket handler = socketListener.Accept();

                string data = null;

                // Дождались клиента, пытающегося соединиться

                while (!Console.KeyAvailable)
                {
                    byte[] bytes = new byte[1024];
                    int bytesRec = handler.Receive(bytes);
                    data += Encoding.ASCII.GetString(bytes, 0, bytesRec);


                    if (data.IndexOf("\n") > -1)
                    {
                        break;
                    }

                }

                Console.WriteLine("Text Received: {0}", data);

                string theReply = "HTTP/1.1 200 OK";
                theReply += "\r\n";
                theReply+="content-type: text/html";
                theReply += "\r\n";
                theReply += "content-length: 51";
                theReply += "\r\n";

                byte[] msg = Encoding.ASCII.GetBytes(theReply);
                handler.Send(msg);
                handler.Shutdown(SocketShutdown.Both);
                handler.Close();
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
            Console.ReadLine();
        }

客户

static void Main(string[] args)
    {
        byte[] bytes = new byte[1024];

        // Соединяемся с удаленным устройством

        try
        {
            //Устанавиваем удаленную конечную точку для сокета

            IPHostEntry ipHost = Dns.Resolve("192.168.1.103");
            IPAddress ipAddr = ipAddr = ipHost.AddressList[0];
            IPEndPoint ipEndpoint = new IPEndPoint(ipAddr, 8080);

            Socket socketSender = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            // Соединяем сокет с удаленной конечной точкой
            socketSender.Connect(ipEndpoint);

            Console.WriteLine("Socket connected to {0}", socketSender.RemoteEndPoint.ToString());

            string theMessage = "GET /RService2 HTTP/1.0";
            theMessage += "\r\n";

            byte[] msg = Encoding.ASCII.GetBytes(theMessage);

            //Отправляем данные через сокет

            int byteSent = socketSender.Send(msg);

            //Получаем ответ

            int bytesRec = socketSender.Receive(bytes);

            Console.WriteLine("The Server said: {0}", Encoding.ASCII.GetString(bytes, 0, bytesRec));

            socketSender.Shutdown(SocketShutdown.Both);
            socketSender.Close();
            Console.ReadLine();
        }
        catch (Exception e)
        {
            Console.WriteLine("Exception {0}", e.ToString());
        }

它是 C# 项目。我更改了我的代码,但很遗憾它不再起作用。我使用 Fiddler gor 调试,并且有这个有趣的东西。在响应标题中,我看到了我的数据(在提琴手窗口中),但在 web-brouser 中没有。它看起来像这样:

 \\ Server
    class Program
{
    static void Main(string[] args)
    {
        byte[] bytes = new byte[1024];

        // Соединяемся с удаленным устройством

        try
        {
            //Устанавиваем удаленную конечную точку для сокета

            IPHostEntry ipHost = Dns.Resolve("192.168.1.103");
            IPAddress ipAddr = ipAddr = ipHost.AddressList[0];
            IPEndPoint ipEndpoint = new IPEndPoint(ipAddr, 8080);

            Socket socketSender = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            // Соединяем сокет с удаленной конечной точкой
            socketSender.Connect(ipEndpoint);

            Console.WriteLine("Socket connected to {0}", socketSender.RemoteEndPoint.ToString());

            string theMessage = "GET /RService2 HTTP/1.0";
            theMessage += "\r\n\r\n";




            byte[] request = Encoding.ASCII.GetBytes(theMessage);

            //Отправляем данные через сокет

            int byteSent = socketSender.Send(request);

            //Получаем ответ

            int bytesRec = socketSender.Receive(bytes);

            Console.WriteLine("The Server said: {0}", Encoding.ASCII.GetString(bytes, 0, bytesRec));

            socketSender.Shutdown(SocketShutdown.Both);
            socketSender.Close();
            Console.ReadLine();
        }
        catch (Exception e)
        {
            Console.WriteLine("Exception {0}", e.ToString());
        }
    }
4

1 回答 1

0

我决定麻烦了!问题发生了,因为我不完全了解 RCF 标准。例如

                string statusLine = "HTTP/1.1 200 OK" + "\r\n";
                string contentLength = "content-length: " + size + ";\r\n"; 
                string contentType = "content-type: text/html;" + "\r\n";

但早期是这样的

                string statusLine = "HTTP/1.1 200 OK" + "\r\n";
                string contentLength = "content-length: " + size + "\r\n"; 
                string contentType = "content-type: text/html" + "\r\n";

这是缺少“;”

于 2013-11-15T09:47:18.310 回答