2016-05-06 4 views
0

У меня возникла проблема с отправкой тела ответа HTTP, и я думаю, что проблема в этой строке out.write(buffer, 0, bytes);, пожалуйста, помогите мне.Отправить HTTP-ответ от нашего сервера к клиенту

DataInputStream din = new DataInputStream(ClientConn.getInputStream()); 

    OutputStream ot = ClientConn.getOutputStream(); 
    BufferedOutputStream out = new BufferedOutputStream(ot); 

    String request = din.readLine().trim(); 
    System.out.println(request); 
    StringTokenizer st = new StringTokenizer(request); 

    String header = st.nextToken(); 
    System.out.println(header); 
    if (header.equals("GET")) { 
     String fileName = st.nextToken(); 
     String file = fileName.substring(1, fileName.length()); 
     System.out.println(file); 
     FileInputStream fin = null; 
     boolean fileExist = true; 
     try { 
      fin = new FileInputStream(file); 
     } 
     catch (Exception ex) { 
      fileExist = false; 
     } 

     String ServerLine = "Simple HTTP Server"; 
     String StatusLine = null; 
     String ContentTypeLine = null; 
     String ContentLengthLine = null; 
     String ContentBody = null; 

     if (fileExist) { 
      StatusLine = "HTTP/1.0 200 OK"; 
      ContentTypeLine = "Content-type: text/html"; 
      ContentLengthLine = "Content-Length: " + (new Integer(fin.available()).toString()); 
     } else { 
      StatusLine = "HTTP/1.0 200 OK"; 
      ContentTypeLine = "Content-type: text/html"; 
      ContentBody = "<HTML>" + 
        "<HEAD><TITLE>404 Not Found</TITLE></HEAD>" + 
        "<BODY>404 Not Found" + 
        "</BODY></HTML>"; 
      ContentLengthLine = (new Integer(ContentBody.length()).toString()); 
     } 

     out.write(StatusLine.getBytes()); 
     out.write(ServerLine.getBytes()); 
     out.write(ContentTypeLine.getBytes()); 
     out.write(ContentLengthLine.getBytes()); 
     // output.writeUTF(file); 
     if (fileExist) { 

      byte[] buffer = new byte[1024]; 
      int bytes = 0; 
      while ((bytes = fin.read(buffer)) != -1) { 
       out.write(buffer, 0, bytes); 

       for (int iCount = 0; iCount < bytes; iCount++) { 
        int temp = buffer[iCount]; 
        System.out.print((char) temp); 
       } 
      } 

     } 

     out.flush(); 
     fin.close(); 
    } else { 
     //out.write(ContentBody.getBytes()); 
    } 

    out.close(); 
    ClientConn.close(); 
+0

Выбрасывает исключение? Что такое сообщение? –

ответ

0

Ваш заголовок не правильно написано в OutputStream, вы забыли написать EOL символы, которые "\r\n" в конце каждой строки. И прежде чем начинать писать содержание своего тела, вам также нужно написать символы EOL.

Другими словами, вам нужно сделать что-то вроде этого:

String eol = "\r\n"; 
Charset charset = Charset.forName("ASCII"); 
byte[] eolBytes = eol.getBytes(charset); 
out.write(StatusLine.getBytes(charset)); 
out.write(eolBytes); 
out.write(ServerLine.getBytes(charset)); 
out.write(eolBytes); 
out.write(ContentTypeLine.getBytes(charset)); 
out.write(eolBytes); 
out.write(ContentLengthLine.getBytes(charset)); 
out.write(eolBytes); 
// End of the header 
out.write(eolBytes); 
// Here the body begin 

Действительно ваш заголовок должен быть закодирован в ASCII.

обновление Ответ:

Другие замечания по поводу вашего кода:

  1. Используйте метод File#exists(), чтобы проверить, если файл существует.
  2. Используйте Files.getAttribute(Paths.get("/path/to/my/file"), "size") чтобы получить размер файла
  3. Если файл не существует, вы просто не записываете тело в свой текущий код.
+0

Спасибо, он успешно работает –

+0

@FlonaKroso хорошие новости! –

+0

мы пробуем запись в файл не существует в URL, чтобы проверить появляется 404 ошибка, но это даст мне это исключение ошибок в потоке «основной» java.lang.NullPointerException \t в http_server.HttpRequest.process (HttpRequest.java:126) \t на http_server.Http_server.main (Http_server.java:25) Java Результат: 1 –

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