2013-07-29 2 views
-1

Я пишу веб-клиент. У меня есть следующий код.Отправка HTTP-запроса

public class Connection extends Thread{ 
public final static int PORT = 1337; 
private ServerSocket svrSocket = null; 
private Socket con = null; 
public Connection(){ 

    try{ 
     svrSocket = new ServerSocket(PORT); 
     System.out.println("Conected to: " + PORT); 

    }catch(IOException ex) 
    { 
     System.err.println(ex); 
     System.out.println("Unable to attach to port"); 
    } 

} 

public void run(){ 

while(true) 
{ 

     try{ 
      con = svrSocket.accept();//on this part the program stops 
      System.out.println("Client request accepted"); 
      PrintWriter out = new PrintWriter(con.getOutputStream()); 
      BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); 
      out.println("GET /<index.html> HTTP/1.1"); 

      out.println("***CLOSE***"); 
      System.out.println(in.readLine()); 
      /* 
      String s; 

      while((s = in.readLine()) != null) 
      { 
       System.out.println(s); 
      }*/ 
      out.flush(); 
      out.close(); 
      in.close(); 
      con.close(); 

      System.out.println("all closed"); 
    } 
     catch(IOException ex) 
    { 
     ex.printStackTrace(); 

    } 



} 
} 

} 

Метод запуска будет использоваться последний сверху. У меня есть файл с именем index.html. Этот файл находится в том же файле, что и код java. То, что я пытаюсь сделать с запросом, - это отправить файл HTML. Но если я запустил эту программу в веб-браузере localhost:1337, отобразится следующее.

GET /<index.html> HTTP/1.1 
***CLOSE*** 

Это не должно отображаться. Появится страница, на которой будут отображаться результаты HTML-кода в index.html.

Index.html код:

<html> 
<head> 
    <title>  </title> 

</head> 
<body bgcolor = "#ffffcc" text = "#000000"> 
    <h1>Hello</h1> 
    <p>This is a simple web page</p> 
</body> 
</html> 

Как получить этот HTML страницы для отображения в браузере?

Спасибо

ответ

0

t похоже, что все хорошо на вашем коде, кажется, вам нужно прочитать заголовок HTTP из входного потока, чтобы вы могли получить запрошенное имя файла, а затем использовать выходной поток Socket для записи ответа от файл.

OutputStream output = con.getOutputStream(); 
BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); 
String fileName = readHeader(in); 
String baseDir = System.getProperty("my.base.dir", "/home/myname/httpserver"); 
boolean exist = true; 
InputStream fileIn = null; 
try { 
    File requestedFile = new File(baseDir, fileName); 
    fileIn = new FileInputStream(requestedFile); 
} catch(Exception e){ 
    exist = false; 
} 

String server = "Java Http Server"; 
String statusLine = null; 
String typeLine = null; 
String body = null; 
String lengthLine = "error"; 

if (exist) { 
    statusLine = "HTTP/1.0 200 OK" + "\r\n"; 
    //get content type by extension 
    typeLine = "Content-type: html/text \r\n"; 
    lengthLine = "Content-Length: " + (new Integer(fileIn.available())).toString() + "\r\n"; 
} else { 
    statusLine = "HTTP/1.0 404 Not Found" + CRLF; 
    typeLine = "text/html"; 
    body = "<HTML>" + "<HEAD><TITLE>404</TITLE></HEAD>" + "<BODY>404 Not Found"+"</BODY></HTML>"; 
} 

output.write(statusLine.getBytes()); 
output.write(server.getBytes()); 
output.write(typeLine.getBytes()); 
output.write(lengthLine.getBytes()); 

output.write("\r\n".getBytes()); 

if (exist) { 
    byte[] buffer = new byte[1024]; 
    int bytes = 0; 

    while ((bytes = fileIn.read(buffer)) != -1) { 
    output.write(buffer, 0, bytes); 
    } 
} else { 
    output.write(body.getBytes()); 
} 
//close sreams 
0

Вы вводите в заблуждение несколько вещей. Прежде всего: то, что вы пишете, - это сервер, а не клиент.

Во-вторых: Вы не следуете протоколу HTT.

Линия GET /<index.html> HTTP/1.1 (что не так, должно быть GET /index.html HTTP/1.1) - это запрос, который отправляется клиентом (например, веб-браузер). Вместо этого ваш сервер отправляет это сообщение.

Быстрое решение:

Вместо отправки статического текста (строка с GET и один с ***CLOSE***), читать содержимое файла index.html и распечатать его на out поток.

EDIT: Вот краткий обзор потока HTTP данных:

  1. клиент (например, браузер) подключается к серверу
  2. Клиент посылает это запрос, что-то вроде

     
    GET /theFileIWant.html HTTP/1.1\r\n 
    Host: localhost\r\n 
    \r\n 
    
  3. В этот момент клиент обычно прекращает отправлять что-либо и ждет ответа сервера. Это называется модель «запрос/ответ».

  4. Сервер считывает данные запроса и выясняет, что он должен делать.
  5. Вывод (в данном случае: содержимое файла) отправляется клиенту с заголовками HTTP-ответа.
  6. Соединение может быть открытым или закрытым в зависимости от HTTP-заголовков запроса клиента и ответа сервера.
+0

И если я хочу увидеть ответ, как 200 OK, как бы я это сделал? – Jonathan

+0

Вместо '' out.println ("GET/ HTTP/1.1"); '' вы используете '' out.println («HTTP/1.1 200 OK»); ''. Посмотрите на [этот пример] (http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Server_response)! – f1sh

+0

Я понимаю, что вы говорите, что быстрое решение состоит в том, чтобы прочитать файл в поток вывода, но смогу ли я подтвердить OK 200? И если я использую правильный синтаксис с запросом, то это произойдет. Файл HTML не подбирается. – Jonathan

Смежные вопросы