2013-11-14 150 views
-1

我创建了一个简单的http服务器,但不幸的是它工作错了。例如,当我使用Web浏览器时,服务器不回复。但是,当我使用提琴手它回答这个:Http服务器故障

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()); 
     } 
    } 
+1

响应主体的52个字节在哪里? – 2013-11-14 11:22:56

+1

这看起来不像Java。方法以一个小写的char i开头。 Wat语言是这个? –

+1

@JBNizet它似乎是C#... – neutrino

回答

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"; 

这是缺乏 “;”