2013-11-14 2 views
-1

간단한 http 서버를 만들었지 만, 불행히도 제대로 작동하지 않습니다. 예를 들어, 웹 브라우저를 사용할 때 서버가 응답하지 않습니다.HTTP 서버에 문제가 있습니다.

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

을 무슨 일이야 : 내가 피들러를 사용하는 경우 그러나이 대답? 추신. 나는 소켓을 사용한다.

서버

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# 프로젝트입니다. 내 코드를 변경했지만 unfortantly 그것은 다시 작동하지 않습니다. 나는 Fiddler gor 디버깅을 사용하고 흥미로운 점이있다. 응답 헤더에서 내 데이터를 봅니다 (바이올린 창에서). 그러나 웹 브로커에서는 그렇지 않습니다. 모양은 다음과 같습니다.

\\ 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 바이트는 어디에 있습니까? –

+1

이것은 자바처럼 보이지 않습니다. 메소드는 소문자로 시작합니다. Java. 와트 언어가 이거 야? –

+1

@JBNizet C# 인 것 같습니다. – neutrino

답변

0

문제를 결정했습니다. RCF standart를 완벽하게 이해하지 못하기 때문에 문제가 발생했습니다. 예를

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

같았다 ";"

관련 문제